2012-06-25 88 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