2017-10-11 4 views
0

私はtcpサーバとそれに接続したいクライアントを2つ持っています。このクライアントの接続方法は、そのうちの1つです。それをclient1と呼ぶことができます。すべての時間に接続してデータを送信し、もう1つはclient2に接続し、少量のデータを送信して切断します。私はO_NONBLOCKオプションをオンに設定しました。私が経験する振る舞いは、サーバー側でデータを連続的に送信しているクライアントが1つのメッセージを受信して​​次の接続を待つことです。これは私がこれまでに試したものです(コードはいつでもどこでもclient2が)を接続してデータを送信し、切断する:tcpノンブロッキングが動作しない

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

listen(sockfd, 5); 
clilen = sizeof(cli_addr); 

int flag = 0; 

do { 

    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 

    if(newsockfd > 0){ 
     //Sockets Layer Call: inet_ntop() 
     inet_ntop(AF_INET6, &(cli_addr.sin6_addr),client_addr_ipv6, 100); 
     printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6); 


     n = recv(newsockfd, buffer, 49,0); 

     if(n > 0){ 

      send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer); 
      memset(buffer,0,sizeof(buffer)); 
     } 
    } 
    newsockfd2 = accept(sockfd, (struct sockaddr *) &cli_addr2, &clilen); 

    //Sockets Layer Call: inet_ntop() 
    if(newsockfd2 > 0){ 
     inet_ntop(AF_INET6, &(cli_addr2.sin6_addr),client_addr_ipv6, 100); 
     printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6); 
     n2= recv(newsockfd2, buffer, 49, 0); 
     if(n2 > 0){ 

      send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer); 
      memset(buffer,0,sizeof(buffer)); 
     } 
    } 


}while(!flag); 

を私もしばらくの内部のオプションを追加し、newsockfdnewsockfd2が、同じ結果にノンブロッキングを設定してみました。

私は間違っていますか?ありがとう! :D

+0

あなたが表示するコードはどうなりますか?デバッガでコードをステップ実行しようとしましたか?システム関数のどれもがエラーを返すことはありませんか?なぜ同じことを2回やっているのですか? –

+0

2つのソケットの間を飛び越す代わりに2つのソケットを開きます。そして非ブロック通信では、epollを使うことになっています(あるいはその種のものを選択してください)。そうでなければ、誰も何も待たずに、それはノンブロッキングの全目的です。 – Slava

+0

@Slavaなので、1つのソケットで2つの接続を同時に処理できないということを教えていただけますか? – Lomazo

答えて

0

acceptから新しいソケットを再取得する場合、このスレッドで1対1の通信が処理されるように、このソケットで新しいスレッドを作成する必要があります。 sockedはノンブロッキングではありません。

関連する問題