ソケット クラスに次のコードがあります。
bool GSocket::Listen(int Port)
{
d->Socket = socket(AF_INET, SOCK_STREAM, 0);
if (d->Socket >= 0)
{
sockaddr Addr;
sockaddr_in *a = (sockaddr_in*) &Addr;
ZeroObj(Addr);
a->sin_family = AF_INET;
a->sin_port = htons(Port);
a->sin_addr.OsAddr = INADDR_ANY;
if (bind(d->Socket, &Addr, sizeof(Addr)) >= 0)
{
if (listen(d->Socket, SOMAXCONN) != SOCKET_ERROR)
{
return true;
}
else
{
Error();
}
}
else
{
Error();
}
}
else
{
Error();
}
return false;
}
「Error()」メソッドは WSAGetLastError を呼び出すだけで、エラーとその説明をアプリに渡します。とにかく、私のマシン (xp sp2) では正常に動作しますが、友人の xp sp3 マシンでは失敗します。具体的には、バインド呼び出しが失敗し、WSAGetLastError が "2" を返します。これは、有効なソケット エラー コードでさえありません。渡された「ポート」の値は 80 です。サービスの UI として単純な HTTP サーバーを実行しています。>= 0 をチェックする理由は完全にはわかりませんが、このコードを使用している Windows 以外のプラットフォームに関連している可能性があります。いずれの場合でも、MSDN によると、バインドのエラーの戻りコードは SOCKET_ERROR であり、これは -1 であるため、チェックは問題ないはずです。
簡単なことを見逃していませんか?
更新: 別のポート番号 '8888' を試したところ、すべてが期待どおりに機能しました。したがって、ポート番号が低いことが問題のようです。サービスを実行する前にそのポートで積極的にリッスンするものは何もないので、Linux/Unix の方法と同様に、特定のパーミッションがない限り、1024 未満のポートでリッスンするプロセスを停止する SP3 のある種の新しいパーミッションの問題であると考えています。物事を行うこと。それでもなんとか整理できるようになりたいです。