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);
を私もしばらくの内部のオプションを追加し、newsockfd
とnewsockfd2
が、同じ結果にノンブロッキングを設定してみました。
私は間違っていますか?ありがとう! :D
あなたが表示するコードはどうなりますか?デバッガでコードをステップ実行しようとしましたか?システム関数のどれもがエラーを返すことはありませんか?なぜ同じことを2回やっているのですか? –
2つのソケットの間を飛び越す代わりに2つのソケットを開きます。そして非ブロック通信では、epollを使うことになっています(あるいはその種のものを選択してください)。そうでなければ、誰も何も待たずに、それはノンブロッキングの全目的です。 – Slava
@Slavaなので、1つのソケットで2つの接続を同時に処理できないということを教えていただけますか? – Lomazo