2

TCP パケットを送信するクライアント アプリケーションがあります。現在、私のアプリケーションはこれを行っています: ソケットを作成し、パケットをバインドして送信します。

struct sockaddr_in localaddress;
localaddress.sin_port = htons(0);
localaddress.sin_addr.s_addr = INADDR_ANY;

int socket;
socket = socket(AF_INET, SOCK_STREAM, 0));
bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) );

別のスレッドでは、アプリケーションが接続してパケットを送信します。

struct socketaddr_in remoteaddress;
// omitted: code to set the remote address/ port etc...
nRet = connect (socket, (struct sockaddr * ) & remoteaddress, sizeof (sockaddr_in ));
if (nRet == -1)
    nRet = WSAGetLastError();
if (nRet == WSAEWOULDBLOCK) {
    int errorCode = 0;
    socklen_t codeLen = sizeof(int);
    int retVal = getsockopt(
            socket, SOL_SOCKET, SO_ERROR, ( char * ) &errorCode, &codeLen );
    if (errorCode == 0 && retVal != 0)
        errorCode = errno;
}
/* if the connect succeeds, program calls a callback function to notify the socket is connected, which then calls send() */

ここで、ローカルポートのポート範囲を指定したいので、コードを次のように変更しました

nPortNumber = nPortLow;
localaddress.sin_port = htons(nPortNumber);

バインドが成功するまで、ポート範囲 ( 4000 - 5000 ) で nPortNumber をループします。

私は常に低いポートから nPortNumber を開始するため、ソケットが以前に同じポートで作成されている場合、WSAEADDRINUSE エラーを errorCode として受け取ります。これは、ソケット作成段階を既に通過しているため、私には遅すぎます。(bind() または connect() で WSAEADDRINUSE を取得しなかったのはなぜですか?)

以前に WSAEADDRINUSE を取得する方法はありますか、またはバインドして接続するポート範囲にソケットを作成する方法はありますか?

前もって感謝します!

4

1 に答える 1

0

100%確実に答えることはできませんが、実際にどの時点でWSAEADDRINUSE.

いずれにせよ、bind で取得できないのは普通のことですINADDR_ANY。IIRC、これは実際にはバインドプロセスを実際の接続に遅らせます(私の推測では、リモートアドレスのルーティングに基づいてINADDRを変更します)。ただし、私の知る限り、接続の呼び出しで実際にエラーが発生するはずです...

于 2011-07-22T06:14:35.453 に答える