Written in Japanese.

WINSOCKのおぼえがき

必要なライブラリ

エラーコード

デバッグ

重複I/O オーバーラップI/O

ソフトバンクの「WinSock2プログラミング」本にのっているけど、わからない。
使い方を知るために、ちょっと記録していきます。
IOREQUEST構造体の説明とかもない。

サンプルコードを見る

WSAOVERLAPPED (msdn-英語)

宣言してる変数
//データバッファとOVERRAPPED構造体は必要のようだ。
WSABUF DataBuf;
WSAOVERLAPPED Overlapped;

// Create a socket for sending data
SendSocket = WSASocket(AF_INET, SOCK_DGRAM, 
		IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED);

//バッファの設定。
DataBuf.len = BufLen;
DataBuf.buf = SendBuf;
WSASendTo(SendSocket, &DataBuf, 1, &BytesSent, Flags,
		 (SOCKADDR*) &RecvAddr, RecvAddrSize, &Overlapped, NULL);

正直使い方はさっぱりわからない。

WSASend
いろんな関数を見ても、同じサンプルコードが載っている。

イベントオブジェクトを作り、イベントハンドルをOVERLAPPED構造体のメンバに代入。
// // イベントオブジェクトを使っている。 // 完了関数は使っていない。 // if (WSARecv(AcceptSocket, &DataBuf, 1, &RecvBytes, &Flags, &AcceptOverlapped, NULL) == SOCKET_ERROR) { if (WSAGetLastError() != WSA_IO_PENDING) printf("Error occured at WSARecv()\n"); } ループに入る。 // // 待つ。待つ。待つ。WSA_INFINITEを指定すると、永久に待つようだ。 // 待ってる間に完了関数を呼び出すようだ。 // イベントがシグナル状態になるか、タイムアウトで関数は制御を返すらしい。 // 最後のフラグが TRUE の時、完了ルーチンを実行してから、制御を返す。 // 最後のフラグが FALSE の時、完了ルーチンを実行しない。 // ただ単に 完了ルーチンを待つ場合には、SleepEx でもよいようだ。 Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE); // // シグナル状態にあるイベントを非シグナル状態にしているらしい。 // WSAResetEvent(EventArray[Index - WSA_WAIT_EVENT_0]); // // イベントの結果を書き込んでいる // WSAGetOverlappedResult(AcceptSocket, &AcceptOverlapped, &BytesTransferred, FALSE, &Flags); // // 受信データをチェックしている // if (BytesTransferred == 0) { printf("Closing Socket %d\n", AcceptSocket); closesocket(AcceptSocket); WSACloseEvent(EventArray[Index - WSA_WAIT_EVENT_0]); return; }

長々とにらめっこをしていると、だんだん判ってきたような気になる。
やってることはイベントオブジェクトとそれほど変わりは無いようだ。

本に載ってるIOREQUEST構造体はオリジナルなので注意。
やってることはイベントオブジェクトとそれほど変わりは無いようだ。

リンク

WINSOCK 関連(無作為)
Internet Programming - API仕様(Winsock関数リファレンス)
recvfrom microsoft winsock (英語)
WINDOWS2000 TCP/IP(microsoft)
winsock FAQ日本語版
winsock laboWSAStartup(わかりやすい)
ぴよぴよ実験室(#34あたり)
HTTPクライアントに特化
HTTPクライアント非同期
1.WSOCK32.DLLでのTCP/IPクライアントモジュール作成
#034 WinSock (その1)
ソケットプログラミング

非ブロッキングモード、ioctlsocket
::digital_labo:: - Winsock Step by Step [Chapter: 7](2004/9/14)
Winsock Programmer's FAQ: Articles: Which I/O Strategy Should I Use?
経験則2: 単純な非ブロック型ソケットは避けること。
経験則3: select()は避ける。
経験則4: 非常に大量のデータを扱うプログラムでは、非同期型ソケットは使わない。
経験則5: 高性能サーバでは、オーバーラップI/Oが望ましい。
経験則6: 中規模の数のコネクションをサポートするためには、非同期ソケットとイベントオブジェクトを検討する。
経験則9: GUIクライアントプログラムには、非同期ソケットが望ましい
経験則10: クライアントプログラムではスレッドはめったに役に立たない
経験則11: スレッドは、プログラムの他の部分への影響が全て丸く収まる場合にのみ使うべし

重複I/O、オーバーラップI/O

重複I/Oについては非常に見つけづらい。
WSAOVERLAPPED (msdn-英語)

winsock VB
VB5から使うWindows API WinSock32ネットワークプログラミング入門
こける Wired(winsock他いろいろVB?)

ネットワーク
Studying HTTP
RFC (Request for Comments)日本語あり
JPNIC RFC-JP(日本の総本山)
IETF Home Page(総本山)

注意 書籍「winsock2 プログラミング ソフトバンク」

referenceで、send, sendto, recv, recvfromの戻り値が、0またはSOCKET_ERRORとなっているが、 正しくは、「成功した時には送受信したバイト数が入る」!!気をつけよう。
マイクロソフトのMSDN(英語版)にはちゃんと書いてあるぞ!


Copyright © 2004 すなやま All rights reserved.

このページの先頭に戻る