gpt4 book ai didi

在 c (gcc) centos 7 中实现的 unix 域套接字中的连接错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:14 27 4
gpt4 key购买 nike

在实现 UNIX 域套接字时,连接总是被拒绝:

部分服务器代码:

    if ((my_sock=socket(AF_LOCAL,SOCK_STREAM,0))<0){
syslog(LOG_USER|LOG_ERR,"Could not create tsdmd socket!!");
printf("Couldn't create socket \n");
exit(-1);
}
printf("Socket created \n");

/* Name the socket */

memset(&s_addr, 0,sizeof(struct sockaddr_un));
s_addr.sun_family = AF_LOCAL;
strncpy(s_addr.sun_path,"/tmp/dsock",strlen("/tmp/dsock")+1);
s_addr_size=(offsetof(struct sockaddr_un, sun_path)
+strlen(s_addr.sun_path)+1);

unlink("/tmp/dsock");
if(bind(my_sock,(struct sockaddr *)&s_addr, s_addr_size)<0)
{ printf("BIND ERROR \n");
close(my_sock);
exit(1);
}
printf("Bind successful to the socket !! \n");

if(listen(my_sock,16)==-1)
{ perror("Listen error !! \n");
exit(-1);
}
printf("Listening to socket \n");

if(connect(my_sock,(struct sockaddr *) &s_addr,s_addr_size)==-1)
{
syslog(LOG_USER|LOG_ERR,"Could not connect, will try later");
perror("connect()");
printf("Couldn't connect to socket... will try later \n");
close(my_sock);
my_sock=-1;

}
else
{
FD_SET(my_sock,&active_fd_set);
printf(" Socket connected \n");
}
printf("Trying again \n\n\n");
}
--------------------------------------------------------------------

运行服务器代码后,重复获得以下输出:

  Socket created
Bind successful to the socket !!
Listening to socket
Couldn't connect to socket... will try later
Trying again

Socket created
Bind successful to the socket !!
Listening to socket
Couldn't connect to socket... will try later
Trying again
.
.
.

我检查了路径“/tmp/dsock”和套接字文件“dsock”,但查看文件内部显示:

    "dsock" [Permission Denied] 

文件的“stat dsock”显示:

      File: ‘dsock’
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: 801h/2049d Inode: 1572866 Links: 1
Access: (0777/srwxrwxrwx) Uid: ( 7418/user) Gid: (25/group)
Access: 2017-08-31 17:16:29.569038461 -0600
Modify: 2017-08-31 17:16:29.569038461 -0600
Change: 2017-09-01 13:28:07.162071494 -0600
Birth: -

找不到错误是什么。客户端也显示类似的连接错误。是不是UNIX domain socket文件权限问题?

最佳答案

你不能调用 connect在监听 socket 上。一旦你绑定(bind)并监听,你唯一应该对监听套接字做的就是调用 accept (或 close 或在 select 中使用其描述符)。

所以服务器应该创建套接字,bind它的地址,listen在它上面然后服务器应该位于(“阻塞”)accept功能。也就是说,它通常在循环中等待连接。

然后(在服务器启动并等待之后)您的客户端需要创建自己的套接字并调用 connect在上面——指定服务器在调用 bind 时使用的相同地址.这将导致 accept在服务器中调用以返回一个实际连接到客户端的套接字的套接字描述符。这是您将使用的 sendrecv进行通信。 (并且客户端的套接字也会被连接。)

此时,服务器中的监听套接字仍可用于接受其他连接(每个连接都将返回其自己的新的唯一套接字描述符)。

虽然可能,但服务器连接到它自己的监听套接字端点并没有实际意义。有什么意义呢?

关于在 c (gcc) centos 7 中实现的 unix 域套接字中的连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46008557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com