c++ - 如何确保 TCP 套接字在创建时连接

标签 c++ sockets winsock tcpsocket

我有一个发送 TCP 数据包的客户端应用程序。目前,我的应用程序是这样做的: 创建一个套接字,绑定(bind)并发送数据包。

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 ) 直到绑定(bind)成功。

因为我总是从低端口启动我的 nPortNumber,如果之前在同一个端口上创建了一个套接字,我会得到 WSAEADDRINUSE 错误作为 errorCode,这对我来说太晚了,因为它已经通过了套接字创建阶段。 (为什么我在 bind() 或 connect() 时没有得到 WSAEADDRINUSE?)

有没有办法让我更早获得 WSAEADDRINUSE,或者有没有办法在绑定(bind)和连接的端口范围内创建套接字?

提前致谢!

最佳答案

我不能 100% 肯定地回答,我应该知道你实际上在什么时候得到 WSAEADDRINUSE

在任何情况下,您在绑定(bind)时得不到它是正常的,因为您使用了 INADDR_ANY。 IIRC,这实际上将绑定(bind)过程延迟到实际连接(我的猜测是它然后根据远程地址的路由更改 INADDR)。但是,据我所知,您实际上应该在调用 connect 时收到错误...

关于c++ - 如何确保 TCP 套接字在创建时连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6785329/

相关文章:

c++ - 加速器.cu(8) : error: attribute "managed" does not apply here?

客户端端口号在服务器 TCP/IP 套接字中显示错误 C 语言编程

java - 如何正确停止serverSocket.accept()

c++ - GetQueuedCompletionStatus 在 UDP 套接字上无限期阻塞

c++ - ICU Unicode 正常与全角

c++ - 错误C2664 : 'CSchemaString::CSchemaString(LPCTSTR)' : cannot convert parameter 1 from 'int' to 'LPCTSTR' [closed]

c++ - 'N' 的无效模板参数,预期的编译时常量表达式

c++ - 系统等待/接收数据时 UDP 网络卡住

c++ - WSAConnect() 与 ConnectEx()

c++ - 在 C++ 的 Winsock 中发送 HTTP GET 请求后,Recv() 函数挂起