1

それなし:

  • MFC
  • ATL

純粋な C++ を使用すると、WSAGetLastError()は10014を返します- 不正なアドレス

  • 私が見逃している/間違っていることは何ですか?

コード図:

sockaddr_in sin;
SOCKET server;

if ((server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
{
    cerr << "Error: socket() return value == SOCKET_ERROR" << endl;
    WSACleanup();
    exit (EXIT_FAILURE);
}

sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(1234); //random port

if(bind(server, (sockaddr *)&sin, sizeof(sin) == SOCKET_ERROR))
{
    wError = WSAGetLastError();
    cerr << "Error: bin() return value == SOCKET_ERROR\n"
            "Details: " << wError << endl;
    WSACleanup();
    exit (EXIT_FAILURE);
}
4

1 に答える 1

6

それが実際のコードである場合、バインド呼び出しの間違った場所に括弧があります。最後の 2 つのうちの 1 つを「sizeof(sin)」の直後に移動する必要があります。

つまり、次のように変更します。

if(bind(server, (sockaddr *)&sin, sizeof(sin) == SOCKET_ERROR))

に:

if(bind(server, (sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)

これは、ソケット プログラミングとは関係のない微妙な C エラーですが、意味的に正しくない構文的に正しいステートメントを簡単に作成できる言語を使用する場合に注意する必要があることを示しています。

あなたが持っている方法では、「」を計算しsizeof(sin) == SOCKET_ERRORます(少なくともWinSockの場合、sizeof(something)は常に1以上で、SOCKET_ERRORは常に-1であるため、常にfalse(ゼロ)です)。

次に、このゼロを bind() の 3 番目の引数として渡します。これは、当然、アドレス構造に十分なサイズを指定していないことを示します。

そのため、bind() はゼロ以外のエラー コードを返しています。これが、if ブロックが実行されている理由です。

非常に微妙なもの。C 言語を 20 年余り使用しているにもかかわらず、私の C 言語への敬意は依然として高く、「妻の意見を尊重する」というよりも、「セレンゲティにいるときはライオンを尊重する」という意味での尊重です。 -)

于 2009-01-19T01:02:20.430 に答える