ソケット通信が途中で切れる

前提

ここに質問の内容を詳しく書いてください。
Visual C++によりソケット通信を行っています。最初に接続確立後、しばらく経過すると通信が切れてしまいます。再接続することは可能ですが、なぜ途中で切れるかが不明で困っています。

実現したいこと

・ソケット通信が途中で切れないようにしたい

発生している問題・エラーメッセージ

サーバー側のPCでVisual C++のソフトを起動(クライアントからの接続待ち状態)。クライアント側PCでTcpIpToolにより接続を要求 ⇒ 接続完了。
5~10分ほどすると、接続が急に切れる。

該当のソースコード

Visual

申し訳ありませんが、都合上部分的なソース開示しかできないため、主要な処理のみを抜粋しています。 //・初期化処理 ret = WSAStartup(MAKEWORD(2, 0), &wsaData); if (ret != 0) { // エラー処理 printf("initialize error\n"); } sock = socket(AF_INET, SOCK_STREAM, 0); sinme.sin_family = AF_INET; sinme.sin_port = htons(port); sinme.sin_addr.S_un.S_addr = htonl(INADDR_ANY); ret = bind(sock, (struct sockaddr*) & sinme, sizeof(sinme)); printf("bind[%d]() return %d\n", i, ret); if (ret != 0) { printf("bind error[%d] : %d\n", i, WSAGetLastError()); // エラー処理 return; } ret = listen(sock, SOMAXCONN); if (ret != 0) { printf("listen error[%d] : %d\n", i, WSAGetLastError()); // エラー処理 return; } eathernetEntity->sock = sock; //・接続要求待ち sock = eathernetEntity->sock; // printf("Waiting for Connection Request.\n"); /* fd_setの初期化します */ FD_ZERO(&readfds); /* selectで待つ読み込みソケットとしてsock2を登録します */ FD_SET(sock, &readfds); tv.tv_sec = 0; tv.tv_usec = 0; ret = select(sock + 1, &readfds, NULL, NULL, &tv); if (ret > 0) { if (FD_ISSET(sock, &readfds)) { ret = accept(sock, NULL, NULL); // sock2 = accept(sock, (struct sockaddr*)&from, &len); // if (sock2 > 100000) { if (ret < 0) { printf("Can’t accepted.\n");       // エラー処理 break; } else { sock2 = ret; printf("Connected [%d] .\n", id); } } } else { // エラー処理 break; } /***************************** timeout check *****************************/ /* fd_setの初期化します */ FD_ZERO(&readfds); /* selectで待つ読み込みソケットとしてsock2を登録します */ FD_SET(sock2, &readfds); eathernetEntity->sock2 = sock2; eathernetEntity->state = STS_IDLE; eathernetEntity->connectState = CONNECTED; devEthernetBufClear(); //・データのやり取りおよび接続状態の監視 sock2 = eathernetEntity->sock2; tv.tv_sec = 0; tv.tv_usec = 0; /* 読み込み用fd_setの初期化 */ /* selectが毎回内容を上書きしてしまうので、毎回初期化します */ memcpy(&fds, &readfds, sizeof(fd_set)); /* fdsに設定されたソケットが読み込み可能になるまで待ちます */ ret = select(sock2 + 1, &fds, NULL, NULL, &tv); /* タイムアウトの場合にselectは0を返します */ if (ret < 0) { // エラー処理 break; } if (ret > 0) { /* sock1に読み込み可能データがある場合 */ if (FD_ISSET(sock2, &fds)) { /* sock1からデータを受信して表示します */ memset(buf, 0, sizeof(buf)); ret = recv(sock2, buf, sizeof(buf), 0); if (ret > 0) { // strcat(message, buf); tmpBuf = gcnew String(buf); eathernetEntity->buf += tmpBuf; // printf("get(robot -> PC) = %s\n", eathernetEntity->buf); } else { printf("disconnection detect\n"); //⇐ここで通信が切断したと認識しています      // エラー処理 eathernetEntity->connectState = DISCONNECTED; eathernetEntity->point = 1; break; } } }

試したこと

・現時点で行った調査
whiresharkによりソケット通信を監視。監視した結果が以下になりますが、内容をよく理解できていません。
下記がその履歴になります。一番左列に記載されているNo.5219まで最初の接続確立までのやりとりです。
PCによっては同環境でも(通信の切断が)発生するものとしないものがあるためPC側の何かしらの設定の可能性とも考えています。
接続完了後は特にコマンドの送受信は行っていません。No.7636が表示されたタイミングとほぼ同じタイミングで、通信が途絶えました。
履歴にある「Membership Report」が定期的に行っている通信か何かであることくらいしか分かっておらず、これが原因かどうかも分かっていない次第です。原因と解決策について御教授いただけますでしょうか。

279 18.564891 192.168.3.27 192.168.3.17 TCP 66 10020 → 49683 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=9158 WS=256 SACK_PERM
4348 266.702499 192.168.3.27 192.168.3.17 TCP 66 10030 → 49684 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=9158 WS=256 SACK_PERM
5219 334.502889 192.168.3.27 192.168.3.17 TCP 66 10050 → 49685 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=9158 WS=256 SACK_PERM
7636 524.137559 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Join group 239.255.255.250 for any sources
7660 524.637509 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Join group 239.255.255.250 for any sources
7679 525.145108 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Join group 224.0.0.251 for any sources
7681 525.145498 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Join group 224.0.0.252 for any sources
7682 525.152740 192.168.3.27 224.0.0.251 MDNS 81 Standard query 0x0000 ANY DESKTOP-4B4N3U0.local, "QM" question
7685 525.153776 192.168.3.27 224.0.0.252 LLMNR 75 Standard query 0x4501 ANY DESKTOP-4B4N3U0
7687 525.156045 192.168.3.27 224.0.0.251 MDNS 119 Standard query response 0x0000 AAAA fe80::9129:c9e6:3dba:a5af A 192.168.3.27
7695 525.637542 192.168.3.27 224.0.0.22 IGMPv3 62 Membership Report / Join group 224.0.0.251 for any sources / Join group 224.0.0.252 for any sources
7751 527.146351 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Leave group 224.0.0.251
7753 527.148926 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Leave group 224.0.0.252
7756 527.154587 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Join group 224.0.0.252 for any sources
7757 527.154742 192.168.3.27 224.0.0.22 IGMPv3 54 Membership Report / Join group 224.0.0.251 for any sources
7758 527.155323 192.168.3.27 224.0.0.251 MDNS 81 Standard query 0x0000 ANY DESKTOP-4B4N3U0.local, "QM" question
7761 527.156142 192.168.3.27 224.0.0.252 LLMNR 75 Standard query 0x993f ANY DESKTOP-4B4N3U0
7763 527.169876 192.168.3.27 224.0.0.251 MDNS 119 Standard query response 0x0000 AAAA fe80::9129:c9e6:3dba:a5af A 192.168.3.27
7764 527.214574 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<20>
7765 527.214705 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<00>
7766 527.214762 192.168.3.27 192.168.3.255 NBNS 110 Registration NB WORKGROUP<00>
7776 527.637505 192.168.3.27 224.0.0.22 IGMPv3 62 Membership Report / Join group 224.0.0.252 for any sources / Join group 224.0.0.251 for any sources
7785 527.965537 192.168.3.27 192.168.3.255 NBNS 110 Registration NB WORKGROUP<00>
7786 527.965586 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<00>
7787 527.965612 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<20>
7802 528.715581 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<20>
7803 528.715626 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<00>
7804 528.715640 192.168.3.27 192.168.3.255 NBNS 110 Registration NB WORKGROUP<00>
7817 529.465588 192.168.3.27 192.168.3.255 NBNS 110 Registration NB WORKGROUP<00>
7818 529.465637 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<00>
7819 529.465652 192.168.3.27 192.168.3.255 NBNS 110 Registration NB DESKTOP-4B4N3U0<20>

補足情報(FW/ツールのバージョンなど)

Windows 10 Pro 64bit (⇐サーバー側、クライアント側ともに同じ)
Visual Stdio 2017 Pro
接続はPC(サーバー側)対PC(クライアント側)。
サーバー側  :IPアドレス 192.168.3.27
クライアント側:IPアドレス 192.168.3.17
ポート番号:10020

コメントを投稿

0 コメント