我正在编写一个非常简单的应用程序,它需要使用许多UDP套接字。但是,当我使用地址连接两个或多个套接字时,我得到连接错误:连接被拒绝。当我将它与一个SOCK_STREAM(父级所必需的)和一个数据报套接字(用于子级)一起使用时,它工作得很好,但是在添加了一个需要使用数据报套接字的子节点后,我得到了这个错误。
一些来源:
int openSocketByPath(char path[106], int type)
{
char _path[108]="";
struct sockaddr_un tempadres = {0};
int tmpsock;
tmpsock = socket(AF_UNIX, type, 0);
if(tmpsock<0)
{
perror("socket() error");
exit(2);
}
tempadres.sun_family=AF_UNIX;
strcat(_path,path);
strcpy(tempadres.sun_path+1,_path);
tempadres.sun_path[0]=0;
if((connect(tmpsock, (struct sockaddr *)&tempadres,sizeof(tempadres)))<0)
{
perror("connect() error");
exit(3);
}
return tmpsock;
}
这会创建套接字(第一个用于父项,循环用于子项):
sd = socket(AF_UNIX, SOCK_STREAM, 0);
if(sd<0)
{
perror("socket() error");
exit(2);
}
on_exit(_close,NULL);
serveradres.sun_family=AF_UNIX;
strcpy(serveradres.sun_path,adres);
if((connect(sd, (struct sockaddr *)&serveradres,sizeof(serveradres)))<0)
{
perror("connect() error");
exit(3);
}
sprintf(id_work,"%d|%s",workers, id);
if(send(sd, id_work, sizeof(id_work), 0)<0) // wyslanie ID
{
perror("send() error");
exit(4);
}
if(recv(sd,&result,sizeof(result),0)<0)
{
perror("recv() error");
exit(5);
}
if(result==-1)
{
printf("error while creating socket");
exit(6);
}
sd = openSocketByPath(id, SOCK_STREAM);
for(int i=0; i<workers; i++)
{
strcpy(tmp,"");
sprintf(tmp,"%s%d",id,i);
if(send(sd, tmp, sizeof(tmp), 0)<0) // wyslanie numeru pracownika
{
perror("send() error");
exit(4);
}
if(recv(sd,&result,sizeof(result),0)<0)
{
perror("recv() error");
exit(5);
}
if(result==-1)
{
printf("error while creating socket");
exit(6);
}
workersSockets[i]=openSocketByPath(tmp,SOCK_DGRAM);