为什么Write系统调用未将任何内容写入套接字文件?

时间:2018-06-22 05:55:29

标签: linux sockets server client

我正在编写一个简单的Server Client程序来交换数据。在写入套接字文件后,写入不会失败,甚至不是部分写入。但是当我使用ls -l检查套接字文件的详细信息时,我仍然看到它的大小为零,服务器什么也没收到。有人可以帮我解决我在这里做错的事情吗?

这是server.c

int main()
{
    int socket_fd = 0;
    struct sockaddr_un addr;
    int result = -1;
    char buffer[MAX_BUFFER_SIZE];

    printf("Creating a socket\n");
    socket_fd = socket(AF_UNIX,SOCK_STREAM,0);
    if(socket_fd == -1)
    {
        perror("SOCKET");
        return 0;
    }
    printf("Socket has been created %d\n",socket_fd);

    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path,_SOCKET_PATH,sizeof(addr.sun_path)-1);

    printf("PATH : %s\n",addr.sun_path);

    if(remove(_SOCKET_PATH) == -1)
    {
        perror("REMOVE");
        return 0;
    }

    printf("Binding the socket\n");
    result = bind(socket_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr_un));
    if(result == -1)
    {
        perror("BIND");
        return 0;
    }
    printf("Binding the socket is done\n");

    printf("Listening to the socket\n");

    if(listen(socket_fd,1) == -1)
    {
        perror("Listen");
        return 0;
    }

    if((result = accept(socket_fd,NULL,NULL)) == -1)
    {
        perror("ACCEPT");
        return 0;
    }

    printf("Connection Accepted\n");

    while (1)
    {
        while (result = read(socket_fd,buffer,sizeof(buffer)-1) > 0)
        {
            printf("Client said : %s\n",buffer);
        }
    }
}

这是client.c

int main()
{
    int socket_fd = 0;
    struct sockaddr_un addr;
    int result = -1;
    char buffer[MAX_BUFFER_SIZE];

    printf("Creating a socket\n");
    socket_fd = socket(AF_UNIX,SOCK_STREAM,0);
    if(socket_fd == -1)
    {
        perror("SOCKET");
        return 0;
    }
    printf("Socket has been found %d\n",socket_fd);

    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path,_SOCKET_PATH,sizeof(addr.sun_path)-1);

    printf("Connecting to the socket\n");
    result = connect(socket_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr_un));
    if(result == -1)
    {
        perror("CONNECT");
        return 0;
    }

    printf("The client is connected to the server.\n");

    while (1)
    {
        memset(buffer,0,sizeof(buffer));
        scanf("%s",buffer);
        printf("DATA WRITTEN %s,%d\n",buffer,strlen(buffer)+1);
        result = write(socket_fd,buffer,strlen(buffer)+1);
        printf("result = %d\n",result);
        sleep(5);
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

if((result = accept(socket_fd,NULL,NULL)) == -1)
...
    while (result = read(socket_fd,buffer,sizeof(buffer)-1) > 0)

您正在尝试从服务器套接字(socket_fd)中读取。相反,您需要读取accept返回的新套接字,即您在result中称为result = accept...的内容。引用man accept

  

成功后,这些系统调用将返回非负整数,即          接受的套接字的文件描述符。发生错误时,返回-1,          并正确设置了errno。