1

ソケット クラスに次のコードがあります。

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 のある種の新しいパーミッションの問題であると考えています。物事を行うこと。それでもなんとか整理できるようになりたいです。

4

2 に答える 2

2

0 から 1023 までの範囲のポート番号は既知のポートであり、オペレーティング システムはそれらにバインドするために管理者権限を必要とする場合があります。したがって、これらのポートを使用しようとするアプリケーションには特権が必要です。

于 2010-07-21T18:28:37.913 に答える
0

あなたはそこで面白いポインタ演算を行っています...スタックにsockaddr_inを置き、それにポインタを渡してバインドするだけです。

sockaddr_in a = {0};
a.sin_family = AF_INET;
a.sin_port = htons(Port);
a.sin_addr.OsAddr = INADDR_ANY;

if (bind(d->Socket, (sockaddr *) &a, sizeof(a)) >= 0)

また、特権が邪魔になっていないかどうかを確認してください。そのポートですでに開いているものはありますか(netstatに問い合わせてください)

于 2009-05-06T04:15:05.543 に答える