我正在尝试在Mac Os X下使用AF_UNIX套接字,我创建了一个包含一些信息的结构:
typedef struct
{
int socket;
int conn;
struct sockaddr addr;
}socket_info;
我使用这些功能:
socket_info* server_init(void)
{
socket_info* result=(socket_info*)malloc(sizeof(socket_info));
socklen_t length=sizeof(struct sockaddr);
bzero(&(result->addr),sizeof(struct sockaddr));
result->socket=socket(AF_UNIX,SOCK_STREAM,0);
(result->addr).sa_family=AF_UNIX;
(result->addr).sa_len=sizeof(struct sockaddr);
strcpy((result->addr).sa_data,"./mysock");
bind(result->socket,&(result->addr),length);
listen(result->socket,MAX);
result->conn=accept(result->socket,&(result->addr),&length);
return result;
}
socket_info* client_init(socket_info* info)
{
socket_info* result=(socket_info*)malloc(sizeof(socket_info));
result->socket=socket(AF_UNIX,SOCK_STREAM,0);
while( connect(result->socket,&(info->addr),sizeof(struct sockaddr))==-1)
{
if(errno==ENOENT)
{
sleep(1);
}
else
{
fprintf(stderr,"Error: %d",errno);
free(result);
result=NULL;
}
}
return result;
}
我在main中使用它们:
int main(int argc, char** argv)
{
socket_info *server_info, *client_info;
pid_t pid;
int fd[2];
pipe(fd);
pid=fork();
if(pid==0)
{
char buffer[100];
read(fd[0], server_info, sizeof(struct sockaddr));
client_info=client_init(server_info);
read(client_info->socket,buffer,100);
printf("Messaggio ricevuto: %s",buffer);
}
else
{
const char* msg="ciao";
server_info=server_init();
write(fd[1],server_info,sizeof(struct sockaddr));
write(server_info->socket,msg,sizeof(msg));
}
close(fd[0]);
close(fd[1]);
return 0;
}
但客户端无法连接:而是打印消息:“错误:61” 可能是什么原因?
答案 0 :(得分:3)
您有两个主要问题:
你有一个经典的竞争条件。如果客户端在服务器设置为侦听之前尝试连接,则客户端将收到错误。
您的服务器不会检查是否有任何错误,因此可能会失败并且您不会知道。
在任何一种情况下,您都会得到正确的错误(连接被拒绝)。
我的钱是第一个问题。如果你翻转客户端和服务器以便孩子是服务器,它可能会从“发生不工作”变为“正在发生工作”。大多数操作系统都让孩子先跑,因为这样可以节省大量的内存,并且在孩子刚刚调用exec
的典型情况下可以消除大量的页面错误。