WinSock / BSDSocket

WSAWaitForMultipleEvents(1, &Event, TRUE, 0, FALSE); // 第3引数はTRUE?


WSAWaitForMultipleEventsの第3引数をTRUEにすることで、通知0を回避できるかもしれない。
この第3引数はWSAWaitForMultipleEventsにて待ち受けるイベントの全ての通知が完了したかどうかを判断する。

これをTRUEにすることで通知0を受け取らなくなったので、困っている方は是非試してみて欲しい。

■続き
http://jamfolder.work/archives/24895834.html
このエントリーをはてなブックマークに追加

WSAWaitForMultipleEvents等でうまく通知をキャッチできない場合、(他にWaitForSingleObject等)
イベント0が通知されているかもしれない

下記のコードはうまくいかない


下記のコードは微妙にうまくいく(FD_READの文には入らない)
続きを読む
このエントリーをはてなブックマークに追加

※ここに書かれている内容は、私の経験則に基づいている内容であり、確証があるわけではない。

connect後にすぐsendを行うと、データが送信されないことがある。
そういうときは、connectの後に、0.3秒程ウェイトを作り、sendするとうまくいく。


経験上、sendが成功したりしなかったりするプログラムに対して有効である。

TCPでは、相手がデータを受け取れなかったとき、そのパケットを再送する。
このとき、他に送信したいデータがあれば、それを再送予定のパケットの最後尾に付加して送信する。
そのため、パケットに複数の境界があるデータを処理できないrecv関数を使用している場合、受信側でパケットを取りこぼしてしまうのである。
このエントリーをはてなブックマークに追加

サーバー/クライアントともに使用可能である。
また、サーバー側で、接続してくるIPを指定せず(一般的なサーバー)に運用する場合、
res.ai_flags = AI_PASSIVE;
を指定しなければならない。

実例
res.ai_flags = AI_PASSIVE;
getaddrinfo(NULL, "80", &hints, &res);
このエントリーをはてなブックマークに追加

sendto(sock, buf, buflen, 0, addrinfo->ai_addr, addrinfo->ai_addrlen);

データが中途半端に送信される場合、buflenの数字を大きくしてあげると送信されるかもしれない。
例:「こんにち」まで送信されるが、「こんにちは」と送信されない。

一部の参考書では、buflenはbufのサイズを示すと書かれているが、
より正確には、「buflenの分だけ送信する」となる。
このエントリーをはてなブックマークに追加

↑このページのトップヘ