Windows でのソケット数上限
Linux だと、ソケット数の上限がデフォルトで 1024 とかに設定されていたと記憶しているのですが、Windows だとどうなんだろう、と。
以下のレジストリに書いてあるみたい。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort
デフォルトでは、5000 …らしいのですが、自分の環境ではこのレジストリ存在しませんでした。。。
書いてない場合、デフォルトで 5000 が使用されるらしいので、まぁ、問題なさそうですが。
注意点として、select 等の非同期イベントを使用する場合は、64 個のソケットしか待てないようです。
なお、WinSock 使用時に用いられる、WSADATA という構造体の中に、iMaxSockets ちゅーものがあります。
typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; // ←コレ unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA, FAR * LPWSADATA;
お、これでソケットの最大数わかるじゃん!と思ったのですが、
どうやらこの値、WinSock 1.X のみで有効なようです。。。残念。
CString strMax; WSADATA wsaData; if (::WSAStartup(MAKEWORD(1, 0), &wsaData) != 0) { ::MessageBox(NULL, _T("Failed to WSAStartup"), _T("警告"), MB_OK); return FALSE; } strMax.Format(_T("ソケット数上限: [%d]"), wsaData.iMaxSockets); ::MessageBox(NULL, strMax, _T("警告"), MB_OK); // ソケット数上限: [32767] if (::WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) { ::MessageBox(NULL, _T("Failed to WSAStartup"), _T("警告"), MB_OK); return FALSE; } strMax.Format(_T("ソケット数上限: [%d]"), wsaData.iMaxSockets); ::MessageBox(NULL, strMax, _T("警告"), MB_OK); // ソケット数上限: [0]
32767 って表示されたことがそこはかとなく気持ち悪いです。。。
そこは、5000 じゃないのん?WinSock 2.0 でやるんで関係ないけど。。。