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 を取得する方法はありますか、またはバインドして接続するポート範囲にソケットを作成する方法はありますか?
前もって感謝します!