簡體   English   中英

讀取時未連接傳輸端點

[英]Transport endpoint is not connected on read

我正在編寫POP3服務器,出於某種奇怪的原因,它只能在我的計算機上工作,而沒有其他人在工作。 它僅以錯誤“傳輸端點未連接”退出。 Google展示了大多數相同錯誤消息的問題是由傳遞套接字ID而不是讀取連接ID引起的,但是我沒有做任何事情,實際上我是想檢查它們是否不同,這是正確的我嘗試運行它的時間。

void pop_protocol(int connection_descriptor){
    pthread_t tid;
    pthread_create(&tid, NULL, pop_worker, (void *) &connection_descriptor);
}

void *pop_worker(void *cd) {
    int connection_descriptor = *((int *) cd);
    socket_write(connection_descriptor, "+OK POP3 server ready\r\n");
}

int sockfd = socket_setup(portno);
while (1) {
    int connection = socket_get_new_connection(sockfd);
    pop_protocol(connection);
}

int socket_setup(int portno){
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1) {
        fprintf(stderr, "Error: Cannot create socket\n");
        perror("");
        exit(1);
    }

    struct sockaddr_in address;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_family      = AF_INET;
    address.sin_port        = htons(portno);

    if (bind(fd, (struct sockaddr *) &address, sizeof(address)) == -1) {
        fprintf(stderr, "Error: Cannot bind socket to port %d\n", portno);
        perror("");
        exit(1);
    }

    if (listen(fd, MAXCONNECTION) == -1) {
        fprintf(stderr, "Error: Cannot listen on port\n");
        perror("");
        exit(1);
    }

    return fd;
}

int socket_get_new_connection(int sockfd){
    struct sockaddr_in address;
    socklen_t addrlen = sizeof(struct sockaddr_in);
    int new_socket = -1;
    int count = 0;
    while (new_socket < 0 && count < ACCEPTCOUNTER) {
        new_socket = accept(sockfd, (struct sockaddr *) &address, &addrlen);
    }

    // Attempt timed out. Exit
    if (count == ACCEPTCOUNTER) {
        fprintf(stderr, "Error: Cannot accept new connections");
        perror("");
        exit(1);
    }

    return new_socket;
}

如果有人可以提供有關該問題的任何見解,我將不勝感激。

您將指向本地變量的指針(參數connection_descriptor )傳遞給新線程。 在創建和執行線程時,很可能會返回pop_protocol函數,並且局部變量不再有效(實際上,它的值仍然可以存在於傳遞給新線程的地址上,但這是未定義的行為) )

嘗試使用mallocconnection_descriptor分配內存,將該內存(不是局部變量!)傳遞給正在創建的線程,並在將套接字ID復制到局部變量后在線程的函數內free該內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM