WSARecv

WSARecvは、アクセプトした相手から送られてきたデータを受信するWindowsAPI・・・。

WSARecv function (Windows)

面倒なのは、WSABUF構造体を使わなければならないということ・・・。

WSABUF構造体のwsaBuf, BYTE型配列btBuf, DWORDのdwRecvLen, dwFlagsなどが要る・・・。

アクセプトしたら、

btBufを0で初期化して、wsaBuf.bufにbtBufのアドレスを、wsaBuf.lenにbtBufのサイズをセットする・・・。

WSARecvの第2引数には、WSABUF構造体の配列を渡さなければいけないようになっている・・・。
今回は1つだけなので、wsaBufのアドレスを渡して、第3引数の個数は1・・・。
dwRecvLen, dwFlagsは、必要だがあらかじめ0に初期化して渡している・・・。
iResultがSOCKET_ERRORでなければ受信成功・・・。

btBufの中身が"q"なら、iExitFlagを1にしてこのループを抜ける・・・。
btBufが改行コードだったら、それは消しておいて出力しない・・・。
そうでないなら、btBufを出力・・・。
実は、Windowstelnetだと、1度に1文字ずつしか送れないのでこんな風にしている・・・。

WSAStartup success!
soc = 124
port = 0fa0, ns_port = a00f
setsockopt(SO_REUSEADDR) success.
bind Success.
listen success.
acc = 128
accept!(IPAddress = 127.0.0.1, Port = 61889)

アクセプトすると、サーバ側はこうなるが、telnet側は何も表示されていない状態になる・・・。
(telnet接続しているが、ちゃんと表示されていない感じ・・・。)
telnet側で"a"とだけ入力(Enterとかは不要、本当に"a"だけ・・・。)すると、

WSAStartup success!
soc = 124
port = 0fa0, ns_port = a00f
setsockopt(SO_REUSEADDR) success.
bind Success.
listen success.
acc = 128
accept!(IPAddress = 127.0.0.1, Port = 61889)
a

サーバ側では"a"が出力される・・・。
続いて、"bc"と連続で入れると、

WSAStartup success!
soc = 124
port = 0fa0, ns_port = a00f
setsockopt(SO_REUSEADDR) success.
bind Success.
listen success.
acc = 128
accept!(IPAddress = 127.0.0.1, Port = 61889)
a
b
c

こんな風に1文字ずつ渡される・・・。
"q"を入れると、

WSAStartup success!
soc = 124
port = 0fa0, ns_port = a00f
setsockopt(SO_REUSEADDR) success.
bind Success.
listen success.
acc = 128
accept!(IPAddress = 127.0.0.1, Port = 61889)
a
b
c
続行するには何かキーを押してください . . .

サーバ側は終了、telnet側も元のコマンドプロンプト状態に・・・。

Sample/WSARecv.cpp at master · bg1bgst333/Sample · GitHub