5

このサーバーは、既存の接続に同時に書き込みながら、クライアントとの新しい接続をリッスンして確立できる必要があります。非同期ノンブロッキング I/O。poll() を使用するように言われましたが、単純にソケット プログラミングを理解しようとして途方もない時間を費やした後でも、poll() 関数の実装方法がわかりません。

int sockfd; 

int main(int argc, char *argv[])
{
 int newsockfd, portno; 
 socklen_t clilen;  
 char buffer[256];       
 struct sockaddr_in serv_addr, cli_addr;  
 int n;             

 if (argc < 2) {         
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1);
 }

 sockfd = socket(AF_INET, SOCK_STREAM, 0);      
 if (sockfd < 0)                    
    error("ERROR opening socket");          

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

 portno = atoi(argv[1]);            
 serv_addr.sin_family = AF_INET;        
 serv_addr.sin_addr.s_addr = INADDR_ANY;    
 serv_addr.sin_port = htons(portno);    

 if (bind(sockfd, (struct sockaddr *) &serv_addr, 
          sizeof(serv_addr)) < 0) 
          error("ERROR on binding");        
 listen(sockfd,5);                  

 clilen = sizeof(cli_addr);     

 while(1){          
     newsockfd = accept(sockfd, 
                 (struct sockaddr *) &cli_addr, 
                 &clilen);              
     if (newsockfd < 0)                 
          error("ERROR on accept");

     // READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ READ 
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);    


     if (n < 0) error("ERROR reading from socket");
     printf("Here is the message: %s\n",buffer);

     // WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE 
     n = write(newsockfd,"I got your message",18); 
     if (n < 0) error("ERROR writing to socket");
     close(newsockfd);  
 }

 return 0; 

}

私の理解では、次のようなものを構築する必要があります。

//  Set up array of file descriptors for polling
struct pollfd ufds[2];
ufds[0].fd = sockfd;    
ufds[0].events = POLLIN; 

ufds[1].fd = newsockfd;
ufds[1].events = POLLOUT;

poll(ufds,2,2000); を使用します。ループ内で sockfd または newsockfd にアクティビティがあるかどうかを確認します。その場合は、適切な読み取りまたは書き込みを使用します。

4

2 に答える 2

0

libevent を使用しないのはなぜですか? 完全に非同期でノンブロッキングです。 http://libevent.org/

于 2013-10-30T10:27:13.930 に答える