
以下のサーバープログラムを用いて、
(acceptしたらスレッド作成し、作成が終ったということをクライアントに知らせるために文字列送信後受信待機している)
#include <winsock2.h>
#include <vector>
#include <process.h>
#include <algorithm>
char *Ver = "0.00";
using namespace std;
unsigned __stdcall Patch( void *Sock );
int main()
{
----WSADATA wsaData;
--------WSAStartup( MAKEWORD(2,0), &wsaData );
----SOCKET RecvSock = socket( AF_INET, SOCK_STREAM, 0 );
----SOCKET SendSockBuf;
----vector<SOCKET> SendSock;
----fd_set ConnectFds, SubConnectFds;
----struct sockaddr_in Recv, Send;
----int len = sizeof(Send);
----Recv.sin_family = AF_INET;
----Recv.sin_port = htons(55555);
----Recv.sin_addr.S_un.S_addr = INADDR_ANY;
--------bind(RecvSock, (struct sockaddr *)&Recv, sizeof(Recv) );
----FD_ZERO( &SubConnectFds );
--------FD_SET( RecvSock, &SubConnectFds );
----listen( RecvSock, 5 );
----vector<unsigned int> thID;
----vector<HANDLE> hTh;
----struct timeval tv;
--------tv.tv_sec = 0;
--------tv.tv_usec = 0;
----while(1)
----{
--------memcpy( &ConnectFds, &SubConnectFds, sizeof(fd_set) );
--------select( 0, &ConnectFds, NULL, NULL, &tv );
--------if ( FD_ISSET(RecvSock, &ConnectFds) )
--------{
------------SendSockBuf = accept(RecvSock, (struct sockaddr *)&Send, &len);
------------if( SendSockBuf != INVALID_SOCKET)
------------{
----------------SendSock.push_back( SendSockBuf );
----------------thID.push_back( hTh.size() );
----------------hTh.push_back( (HANDLE)_beginthreadex(NULL, 0, Patch, &SendSock[hTh.size()], 0, &thID[hTh.size()]) );
------------}
--------}
----}
----closesocket(RecvSock);
----WSACleanup();
----return 0;
}
unsigned __stdcall Patch( void *Sock )
{
----SOCKET *SendSock = (SOCKET *)Sock;
----send( *SendSock, Ver, 5, 0 );
----char Str[5];
----while( Flag == 0 )
----{
--------recv( *SendSock, Str, 5, 0 );
----}
----closesocket( *SendSock );
----return 0;
}
以下のようなクライアントプログラムで文字を送信すると、
#include <WinSock2.h>
using namespace std;
void main()
{
----WSADATA wsaData;
--------WSAStartup( MAKEWORD(2,0), &wsaData );
----SOCKET Sock = socket( AF_INET, SOCK_STREAM, 0 );
----struct sockaddr_in Addr;
--------Addr.sin_family = AF_INET;
--------Addr.sin_port = htons(55555);
--------Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
----connect( Sock, (struct sockaddr *)&Addr, sizeof(Addr) );
----char str[5];
----recv( Sock, str, 5, 0 );
----send( Sock, "0.00", 5, 0);
----shutdown( Sock, 2 );
----closesocket( Sock );
}
クライアントプログラムは終了しているのにサーバープログラムは"0.00"を受信し続けます。
どこがおかしいのか分からないので教えてください
No.1ベストアンサー
- 回答日時:
> while( Flag == 0 )
> {
> recv( *SendSock, Str, 5, 0 );
> }
このループはいつ終了するんでしょう?
ループ中にFlagは変化しませんから最適化で無限ループになっていたりしませんか?
recv()の戻り値は捨てていますが、クライアントが切断したらrecv()が0を返却していたりしませんか?
# その際『Str[]の内容は変化しない』のを受信し続けていると認識していませんか?
recv()で5バイト受信できない。ということも可能性としてはあり得ますがその辺りはどう考えていますか?
# 2バイト、3バイトと受信する可能性がある。
# まぁ実際にはないでしょうけど。
バグが起こるプログラムでバグに関係ないと思われる箇所を削っていったため、一生終らないループになってしまいました。
>その際『Str[]の内容は変化しない』のを受信し続けていると認識していませんか?
恥ずかしながらその通りでした。戻り値の事をすっかり忘れていました。
5バイト受信できない可能性に関してもwhileでの理由と同様に関係なさそうなので削除しました。(実際には5バイトではない)
ありがとうございます。
凄い基本的なことを見落としていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COBOL->C(++)コンバータ
-
文字列から空白を取り除きたい...
-
fgetsなどのときのstdinのバッ...
-
【C言語】テキストファイル内の...
-
javaでunsignedは使えないので...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
Linuxでフォルダ内全ファイル名...
-
c言語プログラミング実行時エラ...
-
phpMyAdminからストアドプロシ...
-
WORDをcharに変換する方法
-
CStringをwchar_tに変換したい
-
数字文字の出現回数を表示する...
-
ラベリング処理プログラム
-
「ポインタのポインタ」を使っ...
-
getchar()を int でとる理由...
-
_TCHAR*での引数の読み込み
-
【C言語】文字型と整数型の違い
-
C言語のfor文です。 繰り返しの...
-
16進数関数のhex関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
間接参照のレベルが異なっています
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
charでの計算?
-
配列をnビットシフトする
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
c言語でユーザ関数を利用して入...
-
干支のプログラム
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
ネットワークにつながっている...
-
getchar()を int でとる理由...
-
間接操作のレベルとは
-
str系関数を使わずに二つの文字...
おすすめ情報