2013-06-02 38 views
0

我正在編寫POP3服務器,出於某種奇怪的原因,它只能在我的計算機上工作,而沒有其他人在工作。它僅僅因錯誤「傳輸端點未連接」而退出。谷歌顯示,同樣的錯誤消息的大多數問題是由傳遞套接字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; 
} 

如果有人能夠提供任何有關該問題的見解,我將非常感激。

+0

'int sockfd = socket_setup(portno); (1){int}連接= socket_get_new_connection(sockfd); pop_protocol(connection); }' 這屬於哪裏? –

+0

哦對不起,它是主要的。 – user2350018

回答

1

將一個指針傳遞給一個局部變量(參數connection_descriptor)到一個新線程。當線程創建並執行時,pop_protocol函數最有可能返回,並且局部變量不再有效(實際上,它的值仍然可以存在於傳遞給新線程的地址處,但它的未定義行爲。)

嘗試爲connection_descriptormalloc創建分配內存,通過內存(不是一個局部變量!)的線程,free在插槽ID後,該線程的函數內部存儲器複製到一個局部變量。

+0

非常感謝你!那就是訣竅。出於某種原因,我認爲這部分內容並沒有考慮到它。最煩人的是它在我自己的電腦上運行無誤。我想我只需要滿足於我的電腦具有足夠內存的事實。 – user2350018

相關問題