gpt4 book ai didi

C AF_UNIX 中的套接字编程连接被拒绝

转载 作者:行者123 更新时间:2023-11-30 17:14:31 25 4
gpt4 key购买 nike

嗨,我正在尝试制作一个简单的程序,它可以 fork ,然后应该像客户端/服务器一样运行。这是我的代码:

int main (){
int sfd,fdc;
struct sockaddr_un sa;
strncpy(sa.sun_path,SOCKNAME,UNIX_PATH_MAX);
sa.sun_family = AF_UNIX;
char buf[N+1];

if (fork() != 0){
sfd = socket(AF_UNIX,SOCK_STREAM,0);
bind (sfd, (struct sockaddr *) &sa ,sizeof(sa));
listen(sfd, SOMAXCONN);
fdc= accept(sfd,NULL,0);
read(fdc,buf,N);
printf("Server got: %s\n",buf);
write(fdc,"bye!",5);
close(fdc);
close(sfd);
exit(EXIT_SUCCESS);
}
else {
sfd = socket(AF_UNIX,SOCK_STREAM,0);

while(connect(sfd, (struct sockaddr *)&sa,sizeof(sa)) == -1){
if (errno == ENOENT){
printf("Aspetto 1 sec\n");
sleep(1);
}
else {perror(NULL); exit(EXIT_FAILURE) ;}
}
write(sfd,"Hallo!",7);
read(sfd,buf,N);
printf("Client got: %s\n",buf);
close(sfd);
exit(EXIT_SUCCESS);
}

我不明白为什么当我尝试将客户端连接到服务器时会失败。我收到此错误:连接被拒绝。我实在找不到问题出在哪里,感谢您的帮助。

最佳答案

首先,关于 fork 然后应该像客户端/服务器一样运行的简单程序:将客户端和服务器放在同一个逻辑 block 中并不是一个好主意。尽管它可以被写成语法上正确的(即它将编译和构建),但我不知道它如何实用。

有很多教程示例,使用 Posix C 创建单独的服务器和客户端应用程序。 Here is one Here is another ,以及 a third

一个一般建议是,当使用具有先决条件的一系列函数(例如套接字的句柄,或先前成功调用另一个函数)时,应始终使用返回值。例如,在示例代码的以下几行中:

if (fork() != 0){
sfd = socket(AF_UNIX,SOCK_STREAM,0);
bind (sfd, (struct sockaddr *) &sa ,sizeof(sa));
listen(sfd, SOMAXCONN);
fdc= accept(sfd,NULL,0);

您选择验证的唯一行是 fork 的结果(这很好)。但您还应该检查其他每个人的结果,并将这些结果作为继续下一步的先决条件。

至少是这样的:

if (fork() != 0)
{
sfd = socket(AF_UNIX,SOCK_STREAM,0);
if(sfd < 0)
{
//notify user
return -1;
}
ret = bind (sfd, (struct sockaddr *) &sa ,sizeof(sa));
if(ret < 0)
{
//check value of errno, and notify user
return -1;
}
ret = listen(sfd, SOMAXCONN);
if(ret < 0)
{
//check value of errno, and notify user
return -1;
}
new_s= accept(sfd,NULL,0);
if(new_s < 0)
{
//check value of errno, and notify user
return -1;
}
// continue...

关于C AF_UNIX 中的套接字编程连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30278375/

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