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

时间:2015-05-16 16:55:18

标签: c sockets connection errno

您好我正在尝试创建一个简单的程序,然后应该像客户端/服务器一样行事。这是我的代码:

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);
    }

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

1 个答案:

答案 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...