簡體   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