当 NIC 收到数据时,C++ recv 没有收到任何东西
C++ recv not receiving anything when NIC received data
我正在编写一个C++ 服务器程序和一个Qt 客户端程序。问题是,当 tcpdump 清楚地显示来自客户端的 tcp 数据包已传送到我的网络接口时,recv() 一直在等待。
服务器程序在 Centos 7.7 上 运行 并使用 g++ 4.8.5 编译
while (true) {
sockaddr_in client_addr{0};
socklen_t client_len = sizeof(sockaddr_in);
newsockfd = accept(sockfd, (sockaddr*)&client_addr, &client_len);
cout << "New connection from " << inet_ntoa(client_addr.sin_addr) << endl;
long bytes;
char buf[1000];
while (true) {
bytes = recv(newsockfd, buf, 1000, 0);
if (bytes < 1) {
if (bytes < 0) { cout << "Error: " << errno << ", " << strerror(errno) << endl; }
break;
}
ProcessRequest(buf, bytes);
}
close(newsockfd);
cout << "Host " << inet_ntoa(client_addr.sin_addr) << " disconnected..." << endl;
}
客户端程序在 Windows 上 运行 并使用 msvc 2017 和 Qt 编译:
QTcpSocket* loginClient = new QTcpSocket(this);
loginClient->connectToHost(ipAddr, Port);
if (!loginClient->waitForConnected(30000)) { return; }
char data[100] = "12345678";
int sendLen = loginClient->write(data, 9);
if (sendLen == -1) { return; }
服务器能够检测到来自客户端的连接,因此 ip 和端口问题已经解决。此外,服务器无法正确检测到与此 Qt 客户端的断开连接。断开连接检测通常会延迟数分钟或无限期延迟。
有趣的是,我在另一个Centos上写了另一个客户端程序运行,服务器可以完美地运行。所以我假设服务器程序没问题?
感谢您的帮助。
发现错误。原来,Client 端与服务器建立了三个连接,其中只有一个已连接,两个在队列中。数据包不是从连接的套接字进入服务器的。这就是打开的文件描述符不从 NIC 读取任何内容的原因。
我正在编写一个C++ 服务器程序和一个Qt 客户端程序。问题是,当 tcpdump 清楚地显示来自客户端的 tcp 数据包已传送到我的网络接口时,recv() 一直在等待。
服务器程序在 Centos 7.7 上 运行 并使用 g++ 4.8.5 编译
while (true) {
sockaddr_in client_addr{0};
socklen_t client_len = sizeof(sockaddr_in);
newsockfd = accept(sockfd, (sockaddr*)&client_addr, &client_len);
cout << "New connection from " << inet_ntoa(client_addr.sin_addr) << endl;
long bytes;
char buf[1000];
while (true) {
bytes = recv(newsockfd, buf, 1000, 0);
if (bytes < 1) {
if (bytes < 0) { cout << "Error: " << errno << ", " << strerror(errno) << endl; }
break;
}
ProcessRequest(buf, bytes);
}
close(newsockfd);
cout << "Host " << inet_ntoa(client_addr.sin_addr) << " disconnected..." << endl;
}
客户端程序在 Windows 上 运行 并使用 msvc 2017 和 Qt 编译:
QTcpSocket* loginClient = new QTcpSocket(this);
loginClient->connectToHost(ipAddr, Port);
if (!loginClient->waitForConnected(30000)) { return; }
char data[100] = "12345678";
int sendLen = loginClient->write(data, 9);
if (sendLen == -1) { return; }
服务器能够检测到来自客户端的连接,因此 ip 和端口问题已经解决。此外,服务器无法正确检测到与此 Qt 客户端的断开连接。断开连接检测通常会延迟数分钟或无限期延迟。
有趣的是,我在另一个Centos上写了另一个客户端程序运行,服务器可以完美地运行。所以我假设服务器程序没问题?
感谢您的帮助。
发现错误。原来,Client 端与服务器建立了三个连接,其中只有一个已连接,两个在队列中。数据包不是从连接的套接字进入服务器的。这就是打开的文件描述符不从 NIC 读取任何内容的原因。