C++ 表示 NIC 收到数据时没有收到任何内容

C++ recv not receiving anything when NIC received data

本文关键字:任何内 数据 表示 NIC C++      更新时间:2023-10-16

我正在编写一个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 上运行的客户端程序,服务器可以完美地工作。所以我认为服务器程序没问题?

感谢您的任何帮助。

发现错误。原来客户端已经与服务器建立了三个连接,其中只有一个已连接,两个在队列中。数据包不是从连接的套接字进入服务器的。这就是为什么打开的文件描述符不会从 NIC 读取任何内容的原因。

相关文章: