私は、教育目的で async (ノンブロッキング rly) ソケット lib を作成しています。TCP 部分は正常に動作しますが、UDP に関しては奇妙な動作が発生します。次のコードは期待どおりに機能します - サーバーはデータを受け取ります:
MyUDPSocket server;
server.Bind(5551);
MyUDPSocket client;
client.Connect("192.168.0.103", 5551);
Sleep(10);
client.Write("\x0", 1);
Sleep(10);
client.Write("test", 5);
ただし、Sleep() または client.Write("\x0", 1); のいずれかの場合。コメントアウトされています-機能しなくなります。サーバーはデータを取得できません。ソケットが正確にどのように作成されるかの手がかりを得るために、私のライブラリのいくつかの部分を次に示します。
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
...............................................
memset( &name, 0, sizeof(name) );
name.sin_family = AF_INET;
name.sin_port = htons( port );
hostent* hostinfo = gethostbyname( address );
name.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr)->s_addr;
connect(s, (sockaddr*)&name, sizeof name)
ご覧のとおり、派手なものはありません。たぶん、接続を初期化するために1バイトのデータを送信する必要があるという暗黙のルールか何かですか?私はここで本当に混乱しています。
編集:要求に応じて関数を書きます。name 変数は、上記のコードの Connect 呼び出しで設定されているものとまったく同じです。
virtual int Write( void* data, int size )
{
return sendto(s, (const char*)data, size, 0, (sockaddr*)&name, sizeof name);
}
編集: select() ループでも、読み取り可能なソケットのみをチェックします。接続が初期化されているため、ソケットが書き込み可能ではない可能性がありますか? その場合は、First sleep を解決する必要があります。しかし、1 バイトを送信する場合はどうでしょうか。