お世話になります。
VC6.0でソケット通信の社内の既存のプログラムを改善しております。
クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。
NETSTATコマンドで確認したところ、
サーバ側では、CLOSE_WAITが大量に出力されており
クライアント側では、FIN_WAIT_2が大量に出力されます。
クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。
サーバ側のEXEを再起動すると、CLOSE_WAITは消えます。
サーバ側のソケットの受信後の処理に問題があるのではと考えておりますが、何処が問題なのかわからない状態です。
コードを以下に記述致します。
WINAPI K010cListener{
/*Winsock初期化*/
WSAStartup(wVersionRequested,&wsaData);
/*SOCKET作成*/
fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
/*ポートの設定*/
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_family = AF_INET;
addr.sin_port = htons(usPortNo);
addrlen = sizeof(addr);
/*BIND*/
bind(fd,(struct sockaddr*)&addr,addrlen)
/*LISTEN*/
listen(fd,0)
while(1){
/*ACCEPT*/
fd2 = accept(fd,(struct sockaddr*)&addr,&addrlen)
//データ受信
waitReceiveThread(fd2, &rcv_msg);
//DBオープン
ConnectDB()
//DB登録
AddTable(&rcv_msg)
//DBクローズ
CloseDB()
}
/*Winsock終了*/
WSACleanup();
}
void waitReceiveThread(SOCKET fd, SockRcvMsg *rcv_msg) {
while (1) {
/*データ受信待ち*/
rcvSize = recv(fd,rcvBuf,sizeof(rcvBuf),0);
if (rcvSize <= 0) {
continue;
}
else {
/* 返信電文の準備 */
memset(sndBuf,0x20,sizeof(sndBuf));
memcpy(sndBuf ,"RCMORDER00004800000000",22);
/* 返信電文の送信 */
send(fd,(char*)sndBuf,sizeof(sndBuf),0);
/* バッファの初期化 */
bufsize=0;
memset(buf,'\0',sizeof(buf));
break;/*ループを抜ける*/
}
}
}
恐れ入りますが、ご教授いただければ幸いです。
宜しくお願い申し上げます。
No.1ベストアンサー
- 回答日時:
waitReceiveThread()においてrecv()の戻り値rcvSizeが0以下の場合、そのコネクションは切断された物として処理するのが妥当だと思います。
origin_93様の書かれたプログラムでは無理やりcontinueしてrecv()を繰り返しいるため、切断後の正常動作は期待出来ません。かなり大雑把ですが、一般的なサーバの動作は下記の流れの様になります。
while (TRUE) {
socket();
bind();
listen();
while (TRUE) {
accept();
while (TRUE) {
ret = recv();
if (ret <= 0) break;
else {
受信処理
}
}
}
}
一番外側のループは要らないかもしれませんが、socket()等の戻り値がエラーだった場合を考慮しています。
複数のクライアントが接続するならば、acceptの後で受信スレッドを生成し、そのままループします。acceptで取得したレシーブソケットは受信処理のループを抜けた所でクローズして構いません。
上記コードに、内側のループをbreakし、acceptする前にclose処理を入れてで作成したところ、問題なく動作しました。
誠にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- デスクトップパソコン 阿武町4630万円誤送金事件。町工場ではPC98が現役なのに「未だにFDを使ってるの?」って・・・ 8 2022/06/01 19:20
- その他(メールソフト・メールサービス) メールソフトを教えてください 1 2023/03/28 23:32
- その他(メールソフト・メールサービス) メールが送信できない 発信側でできる対策 3 2023/05/11 10:22
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
エクセル VBA でのCOMポート...
-
VB6‥ソケットについて
-
recv関数でフリーズしてしまう
-
UDP通信する時に、相手にどうや...
-
ソケットのrecvの戻り値が0
-
WinSockでの通信プログラムがう...
-
ソケットのクローズについて
-
UDPのソケットプログラミング
-
WinSockでのソケット通信
-
winsockでファイル転送
-
バインドと接続(BindException...
-
TCP/IP通信(ソケット通信)に...
-
空きポートの取得方法
-
winsockのポート指定について
-
クライアントソケットMACアドレ...
-
C#でメッセンジャー作ってます...
-
ソケット通信 同じポート番号...
-
UDPで受信終了の合図を出して受...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
Socket通信の0バイト受信について
-
ソケット通信 同じポート番号...
-
相手のIPアドレスを取得する方法
-
ソケットでクライアントのipア...
-
VB6のwinsockでconnectできない
-
Connectエラーが出てしまう・・...
-
ソケット通信の送受信遅延-02 ...
-
同じLAN内パソコンのIPアドレス...
-
WinSockでの通信プログラムがう...
-
UDPのソケットプログラミング
-
非ブロッキングソケットのrecv...
おすすめ情報