2012-06-25 89 views
0

我有下面的代碼實現一個非阻塞TCP接受器。客戶端能夠連接,沒有任何問題,寫作似乎也發生,但接受者不會從套接字讀取任何內容,並且無限期地調用read()塊。 我接受者使用了一些錯誤的設置嗎?非阻塞TCP-接收器沒有從套接字讀取

親切的問候 AFG

int main(){ 
    create_programming_socket(); 
    poll_programming_connect(); 
    while(1){ 
     poll_programming_read(); 
    }  
} 


int create_programming_socket(){ 
    int cnt = 0; 
    p_listen_socket = socket(AF_INET, SOCK_STREAM, 0); 
    if(p_listen_socket < 0){ 
     return 1; 
    }  

    int flags = fcntl(p_listen_socket, F_GETFL, 0); 
    if(fcntl(p_listen_socket, F_SETFL, flags | O_NONBLOCK) == -1){ 
     return 1; 
    } 

    bzero((char*)&p_serv_addr, sizeof(p_serv_addr));  

    p_serv_addr.sin_family = AF_INET; 
    p_serv_addr.sin_addr.s_addr = INADDR_ANY; 
    p_serv_addr.sin_port = htons(p_port);  

    if(bind(p_listen_socket, (struct sockaddr*)&p_serv_addr 
    , sizeof(p_serv_addr)) < 0) { 
     return 1; 
    } 
    listen(p_listen_socket, 5); 
    return 0; 
} 


int poll_programming_connect(){ 
    int retval = 0; 
    static socklen_t p_clilen = sizeof(p_cli_addr); 
    int res = accept(p_listen_socket, (struct sockaddr*)&p_cli_addr, &p_clilen); 
    if(res > 0){ 
     p_conn_socket = res; 
     int flags = fcntl(p_conn_socket, F_GETFL, 0); 
     if(fcntl(p_conn_socket, F_SETFL, flags | O_NONBLOCK) == -1){ 
      retval = 1; 
     }else{ 
      p_connected = true;  
     } 
    }else if(res == -1 && (errno == EWOULDBLOCK || errno == EAGAIN)) { 
    //printf("poll_sock(): accept(c_listen_socket) would block\n");  
    }else{ 
     retval = 1; 
    } 
    return retval; 
    } 

    int poll_programming_read(){ 
    int retval = 0; 
    bzero(p_buffer, 256); 
    int numbytes = read(p_conn_socket, p_buffer, 255); 
    if(numbytes > 0) { 
     fprintf(stderr, "poll_sock(): read() read %d bytes\n", numbytes); 
     int fred; 
     int i; 
    } else if(numbytes == -1 && (errno == EWOULDBLOCK || errno == EAGAIN)) { 
    //printf("poll_sock(): read() would block\n"); 
    } else { 
     close(p_conn_socket); 
     p_connected = false; 
     retval = 1; 
    } 
    return retval; 
} 
+0

我用額外的日誌記錄/ printf跟蹤代碼(這裏沒有顯示) –

+0

爲什麼你忽略所有的返回值和條件指示符? – EJP

回答

3

poll_programming_connect的調用是while循環之外 - 因此它很可能不接受的連接(失敗EWOULDBLOCK)。所以你沒有一個有效的套接字來讀取。

在致電poll_programming_read之前,您需要等到您有連接。

+0

從這裏的代碼,讀取套接字是一個全局變量,所以poll_programming_read()將從標準輸入讀取結束。 – nos