繁体   English   中英

非阻塞TCP接收器不从套接字读取

[英]non blocking TCP-acceptor not reading from socket

我在下面的代码中实现了非阻塞TCP接受器。 客户端可以毫无问题地进行连接,并且写入似乎也正在发生,但是接受器不会从套接字读取任何内容,并且对read()的调用会无限期地阻塞。 我为接收器使用了错误的设置吗?

亲切的问候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;
 }

poll_programming_connect的调用不在您的while循环之外-因此它很可能不接受连接(EWOULDBLOCK失败)。 因此,您没有有效的套接字可以读取。

您需要等到建立连接后才能调用poll_programming_read

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM