Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中的数据报套接字。看起来父进程从未绑定_C_Sockets_Ipc_Datagram - Fatal编程技术网

c语言中的数据报套接字。看起来父进程从未绑定

c语言中的数据报套接字。看起来父进程从未绑定,c,sockets,ipc,datagram,C,Sockets,Ipc,Datagram,我已尝试执行以下两个进程的代码。 孩子发送一个数据报,父母应该接收并打印它 . 父进程看起来没有绑定(错误:地址已在使用中)。 有什么想法吗 #include <sys/socket.h> #include <sys/un.h> #include <signal.h> #include <stdio.h> #define N 9 int main(int argc, char *argv[]) { int pid,s,n,addrlen;

我已尝试执行以下两个进程的代码。 孩子发送一个数据报,父母应该接收并打印它 . 父进程看起来没有绑定(错误:地址已在使用中)。 有什么想法吗

#include <sys/socket.h>
#include <sys/un.h>
#include <signal.h>
#include <stdio.h>

#define N 9

int main(int argc, char *argv[]) {

int pid,s,n,addrlen; 
char msg[N]; 
struct sockaddr_un addr;

addr.sun_family=AF_UNIX;        
strcpy(addr.sun_path,"test-socket");    // pathname
addrlen=sizeof(addr.sun_family)+strlen(addr.sun_path);

if (!(pid=fork())) {
    printf("child\n");
    s=socket(PF_UNIX,SOCK_DGRAM,0); 
    sleep(3); /* wait for parent to bind */

    sendto(s,"hi parent",9,0,(struct sockaddr*)&addr,addrlen);  
    printf("child sent\n");
    close(s);

    return(0);
}
printf("father\n");
s=socket(PF_UNIX,SOCK_DGRAM,0);
bind(s,(struct sockaddr *)&addr,addrlen);   // error here

n=recvfrom(s,msg,N,0,NULL,NULL);        
if(n<=0){printf("error\n");}
msg[n]='\0'; printf("%s\n",msg);
close(s);
unlink("test-socket");              

return(0);
#包括
#包括
#包括
#包括
#定义n9
int main(int argc,char*argv[]){
内部pid,s,n,addrlen;
半焦味精[N];
结构sockaddr_un addr;
地址sun_family=AF_UNIX;
strcpy(addr.sun_路径,“测试套接字”);//路径名
addrlen=sizeof(addr.sun_family)+strlen(addr.sun_path);
如果(!(pid=fork()){
printf(“child\n”);
s=套接字(PF_UNIX,SOCK_DGRAM,0);
睡眠(3);/*等待家长绑定*/
发送至(s,“hi parent”,9,0,(结构sockaddr*)和地址,地址;
printf(“已发送的子项”);
关闭(s);;
返回(0);
}
printf(“父亲”);
s=套接字(PF_UNIX,SOCK_DGRAM,0);
绑定(s,(struct sockaddr*)&addr,addrlen);//此处出错
n=recvfrom(s,msg,n,0,NULL,NULL);

如果(n为什么不在fork之前绑定?在我的系统(Mac OS X Snow Leopard)上等待固定的时间然后发送数据不是一个好主意

struct  sockaddr_un {
        unsigned char   sun_len;        /* sockaddr len including null */
        sa_family_t     sun_family;     /* [XSI] AF_UNIX */
        char            sun_path[104];  /* [XSI] path name (gag) */
};
假设您的外观类似,您对
addrlen
sizeof(addr.sun_family)+strlen(addr.sun_path)
)的计算是错误的,这将导致使用它的调用
sendto
bind
使用与您认为使用的路径不同的路径–它将被截断

bind
的调用可能正在创建一个名为
testsocke
的套接字文件(注意末尾缺少的
t
)。当您的程序完成时,它会尝试
取消链接
不存在的文件
测试套接字
。这意味着下次运行程序时,您试图
绑定的文件(
测试套接字
)已经存在,因此
绑定
将以您看到的方式失败

要解决此问题,您需要确保为
addrlen
使用正确的长度。最简单和最安全的方法可能是使用
sizeof(addr)

如果有
SUN\u LEN
,您也可以使用它,这样可以节省您复制几个字节的时间,如果这与您有关:

addrlen = SUN_LEN(&addr);
如果您想自己计算正确的长度(例如,
SUN\u LEN
不可用),请尝试以下方法:

addrlen = sizeof(addr) - sizeof(addr.sun_path) + strlen(addr.sun_path);

(这是根据我的系统上的
SUN_LEN
的定义改编而成的。)

您似乎正在将九个字节接收到一个九字节的缓冲区中,然后在缓冲区结束后以null终止一个字节(
msg[n]
)。您可以更正此问题并重试吗?您不会检查来自
socket
bind
sendto
的返回值。请执行此操作,并在记录错误时使用
errno
/
strerror
,查看是否忽略了问题。bind命令返回错误:address ready in used试图创建socket并绑定b在叉子之前…没用
addrlen = sizeof(addr) - sizeof(addr.sun_path) + strlen(addr.sun_path);