C++ 表示 NIC 收到数据时没有收到任何内容
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 上运行的客户端程序,服务器可以完美地工作。所以我认为服务器程序没问题?
感谢您的任何帮助。
发现错误。原来客户端已经与服务器建立了三个连接,其中只有一个已连接,两个在队列中。数据包不是从连接的套接字进入服务器的。这就是为什么打开的文件描述符不会从 NIC 读取任何内容的原因。
相关文章:
- QChart在使用QDateTimeAxis时不显示任何系列数据
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 是否可以检查存储在堆栈上的单词是否是回文,而C++中没有任何附加数据结构
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- C++ 中是否有任何内置阶乘函数?
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 如果在输入中,我给出任何字符数据,为什么这不会抛出部分
- MFC 中是否有任何类似数据网格视图的控件
- 我需要在C /C#中使用图形.我可以使用任何内置的C /C#库
- 是否有任何内置类可以处理C 中的大整数值
- 协议缓冲区、Apache Thrift或任何其他数据结构序列化协议中的递归数据结构
- 如何将比较和交换用于任何共享数据结构的免等待互斥
- 具有非常快速的内>数据查找和快速反向查找(搜索/插入/删除数据)的压缩字典?
- C++ 使用函数模板查找任何输入数据类型的中间值
- c ++中是否有任何内置功能可以在计划的时间运行任务
- 是否有任何内置的 UTF 在 c++ 在窗口中
- 在VC++2010中执行任何内置的ARRAY函数
- C++:如何在不使用任何内置函数的情况下将字符串转换为整数
- 是否有任何内置的CUDA函数允许CUDA内核向主机代码报告错误?