繁体   English   中英

随机读取套接字引发 errno 9

[英]read socket raise errno 9 randomly

我有一个客户端/服务器设置通过 tcp sockets 进行通信。 功能明智的工作非常好,除了我在读取服务器端的套接字时随机但经常出现 errno 9。 根据我可以找到的文档和讨论,当对本地关闭的套接字执行读取操作时,会引发 errno。 我很确定我没有在服务器端的读取循环中关闭套接字。 发送消息后,套接字仅由客户端关闭。 这是服务器端的阅读循环

void *client_listener_thread(void *args)
    {
    struct th_params *param = (void  *) args;
    int sockfd, n, client_pos;
    message_t messageR;
    char logbuf[256], buf[256];
    sockfd = param->socket;
    while(1)
        {
        n = read(sockfd, &messageR, sizeof(message_t));
        if (n < 0)
            {
            sprintf(logbuf, "cmd_thread: ERROR reading from socket errno=%d sock=%d thread=%x", errno, sockfd, (uint32_t)(param->client_listener));
            logwts(logbuf);
            break;
            }
        else if(n == 0)
            {
            sprintf(logbuf, "cmd_thread: socket closed by remote peer 2 %x", (uint32_t)(param->client_listener));
            logwts(logbuf);
            break;
            }
        else
            {
            inet_ntop(AF_INET, &messageR.header.sender_ip, buf, 255);
            sprintf(logbuf, "cmd_thread:URC Message: ID = %d sender = %s\n", messageR.header.messageID, buf);
            logwts(logbuf);

// process message
            switch(messageR.header.messageID)
                {
                case IDENT_ACK:
                    ...
                    sprintf(logbuf, "New client registered on socket %d  %d / %s:%d", sockfd, client_pos, buf, messageR.header.sender_port);
                    logwts(logbuf);
                    break;
                ...
                
                default:
                    sprintf(logbuf, "cmd_thread:unprocessed message %d", messageR.header.messageID);
                    logwts(logbuf);
                    break;
                }
            }
        }
    if(sockfd)
        close(sockfd);
    pthread_exit(NULL);
    } 

在客户端,它只是打开套接字,发送消息,关闭套接字。 运行时,在服务器端,我在第一次读取时收到“新客户端注册...”消息,在第二次读取时,我收到预期的“远程对等方关闭套接字...”消息或意外“从套接字读取错误..” 错误号 = 9
正如我所说的功能没有问题,没有消息丢失,消息被接收和处理。 我可以忽略这个错误,但我想先理解它。

感谢 strace 可以找到罪魁祸首。 线程之间的竞争条件。 一个线程正在关闭套接字,而另一个线程仍在使用它。 互斥体完成了这项工作。 完全正确@Sinic 的评论“......描述符(在本例中为 5)正在其他地方关闭......”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM