如何确保TCP套接字在创建时连接
How to make sure a TCP socket connects at creation time
我有一个发送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,这对我来说太晚了,因为它已经通过了套接字创建阶段。(为什么我没有得到WSAEADDRINUSE在bind()或connect()?)
是否有一种方法我可以得到WSAEADDRINUSE更早,或者有一种方法来创建绑定和连接的端口范围套接字?
提前感谢!
我不能百分之百肯定地回答,我应该知道在什么时候你实际上得到了WSAEADDRINUSE
。
在任何情况下,它是正常的,你没有得到它在绑定,因为你使用INADDR_ANY
。IIRC,这实际上延迟了绑定到实际连接的过程(我的猜测是,它随后会根据远程地址的路由更改INADDR)。但是,据我所知,您应该在调用connect…
相关文章:
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- C++套接字客户端到 Python 服务器未创建连接
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 如何在C++中创建特定大小的消息以通过UDP套接字发送?
- 在线程C++中创建一个套接字
- 从 PHP 调用已编译的C++可执行文件来创建套接字
- C++ 套接字编程:创建多个流
- 在新计算机上,ZMQ上下文套接字创建要慢得多
- C 创建多个套接字客户端
- 根据C++代码在 PHP 中创建字节数据并将其传递给套接字
- 正在创建多个TCP套接字连接
- 连接到Boost.Asio创建的域套接字时权限被拒绝
- 我缺少什么来创建套接字
- 当服务器重新启动并且客户端收到WSAECONNRESET错误代码时,我应该重新创建整个套接字吗
- 在具有 DNS 名称时创建套接字
- 如何在同一程序中创建多个套接字
- 创建一个原始套接字 - Debian + 代码块
- 从服务器套接字创建守护进程处理
- 如何在c++ /QT中使用TCP服务器套接字创建Http服务器
- 如何使用QTcp-Server套接字创建HTTP MJPEG流媒体服务器