このスニペットは、ソケットが接続されている (または接続している) 場合に true を返し、何かが失敗した場合に false を返す関数の一部です。
if(bind(socket_, reinterpret_cast<sockaddr*>(&any), sizeof any) < 0)
{
DWORD err = GetLastError();
logger() << "bind: " << ErrorMessage(err) << std::endl;
return false;
}
rc = ConnectEx(socket_,
reinterpret_cast<sockaddr*>(&addr_),
sizeof addr_,
NULL, 0, NULL,
&connectOv_.ov);
if(rc)
{
setsockopt(socket_, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
return true;
}
DWORD err = GetLastError();
if(err == WSA_IO_PENDING)
{
return true;
}
logger() << "connect: " << ErrorMessage(rc) << std::endl;
return false;
ブロックの実際の結果に関係なく、rc と err が常にゼロである理由がわかりません。パラメータが正しい場合 (上記のシーケンス)、このブロックは障害の兆候にもかかわらず機能します (ソケットが netstat に接続されていることがわかります)。しかし、オーバーラップを NULL に変更するか、ソケットを -1 に変更してパラメーターを微調整すると、関数は同じ値を返します。