【问题标题】:Why is the Write system call in not writing anything to the sockets file?为什么 Write 系统调用不向套接字文件写入任何内容?
【发布时间】:2018-12-01 13:13:52
【问题描述】:

我正在编写一个简单的服务器客户端程序来交换数据。在我写入套接字文件后,写入不会失败,甚至不是部分写入。但是当我使用 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);
    }
}

感谢您的帮助!

【问题讨论】:

    标签: linux sockets server client


    【解决方案1】:
    if((result = accept(socket_fd,NULL,NULL)) == -1)
    ...
        while (result = read(socket_fd,buffer,sizeof(buffer)-1) > 0)
    

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

    成功时,这些系统调用返回一个非负整数 接受套接字的文件描述符。出错时,返回 -1, 并且 errno 设置得当。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2020-04-28
      • 2010-12-25
      • 2014-09-01
      • 2016-04-15
      相关资源
      最近更新 更多