您好我正在尝试创建一个简单的程序,然后应该像客户端/服务器一样行事。这是我的代码:
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);
}
当我尝试将客户端连接到服务器时,我不明白为什么会失败。我收到此错误:拒绝连接。 我无法找到问题所在,感谢您的帮助。
答案 0 :(得分:0)
首先,关于分支的简单程序,然后应该像客户端/服务器一样:在同一逻辑块中拥有客户端和服务器不是一个好主意。虽然它可以写成语法正确(即它将编译和构建),但我不知道它将如何实用。
有许多教程示例,使用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...