我有一个发送 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);
并在我的端口范围内循环 nPortNumber,例如( 4000 - 5000 ),直到绑定成功。
由于我总是从低端口启动我的 nPortNumber,如果之前在同一端口上创建了一个套接字,我会收到 WSAEADDRINUSE 错误作为 errorCode,这对我来说太晚了,因为它已经通过了套接字创建阶段。(为什么我没有在 bind() 或 connect() 获得 WSAEADDRINUSE?)
有没有办法我可以更早地获得 WSAEADDRINUSE 或者有没有办法在绑定和连接的端口范围内创建一个套接字?
提前致谢!