开一个线程只调用recvfrom(),然后存放数据,接收到的数据比 wireshark 抓到的包少,怎么回事?
void recvThread()
{
while (1)
{
rn = recvfrom(buffer);
if (rn > 0) memcpy(data, buffer, rn);
}
}
接收线程就调用了recvfrom接收数据,然后做一个数据拷贝,我开了10个接收线程,结果接收的数据没有wireshark抓到的数据多,大神,什么情况? recvfrom 网络 wireshark C++
[解决办法]
我觉得多个线程争抢一个缓冲区的资源,可能会造成线程死锁。你把线程收到抱之后,打上一个log看看,确定是不是因为死锁,造成了某些包没有被完全读取
[解决办法]
1、可先排除多线程的问题,使用一个线程收,只接收并解析包的数量,不做协议解析。
2、降低发包率,找出不出现丢包的临界值
[解决办法]
一个包10k,这。。还建议还是把包分小一些发送吧。
单线程的时候,也出现这个问题,那差不多就是缓冲区出问题了。
其实网络条件好的话,UDP丢包的可能性很小。
[解决办法]
我试过包大小1k 间隔1ms或更小 那样的设置是没有问题的,问题就出在包比较大发送又很快的时候 就出现那样的情况
会不会和udp底层的发送接收机制有关系 导致recvfrom一段时间不能接收的 会不会是ip分片 却没有组包完成 所以阻塞在那了 <却又没有错误反馈??额>
--.最后各位大大有没有啥方法能提升udp可靠传输效率的方法
和MTU有关系,发包太大时,传输的时候会分片的,一片一片的传
[解决办法]
从你的描述来看,你的程序应该是没有接收问题的,当然如果发得太快接得慢,势必导致丢包。
[解决办法]
你设置了不允许分片时,才到不了对端。
[解决办法]
void *Server::receiveTurnThread(void *ptr)
{
return ((Server *)ptr)->receiveTurnThreadFunction();
}
void *Server::receiveTurnThreadFunction()
{
int data_length = 0; // 实际接收数据的大小
char data_buffer[MAX_DATA_LENGTH]; // 接收数据缓存 使用和data_相同大小空间
AddrInfo source_addr; // 保存发送者的地址信息 用于回发数据包
while (0 == stop_all_thread_flag)
{
data_length = server_socket.recvFrom(data_buffer, MAX_DATA_LENGTH, &source_addr);
if (data_length <= 0
[解决办法]
data_length > (int)MAX_DATA_LENGTH)
{
fprintf(stderr, "warning << turn server receive a error package : %d.\n", data_length);
continue;
}
// 将接收到的数据插入到队列中
data_queue->pushQueue(data_buffer, data_length, source_addr);
}
return NULL;
}
队列的多线程同步问题,经过大量测试时可以保证没有问题的!
recvFrom()只是简单的针对Windows平台和Liunx平台分别调用了相应的recvfrom().
data_buffer缓冲区一个线程只有一份吧?多次接收?
[解决办法]
void *Server::receiveTurnThread(void *ptr)
{
return ((Server *)ptr)->receiveTurnThreadFunction();
}
void *Server::receiveTurnThreadFunction()
{
int data_length = 0; // 实际接收数据的大小
char data_buffer[MAX_DATA_LENGTH]; // 接收数据缓存 使用和data_相同大小空间
AddrInfo source_addr; // 保存发送者的地址信息 用于回发数据包
while (0 == stop_all_thread_flag)
{
data_length = server_socket.recvFrom(data_buffer, MAX_DATA_LENGTH, &source_addr);
if (data_length <= 0
[解决办法]
data_length > (int)MAX_DATA_LENGTH)
{
fprintf(stderr, "warning << turn server receive a error package : %d.\n", data_length);
continue;
}
// 将接收到的数据插入到队列中
data_queue->pushQueue(data_buffer, data_length, source_addr);
}
return NULL;
}
队列的多线程同步问题,经过大量测试时可以保证没有问题的!
recvFrom()只是简单的针对Windows平台和Liunx平台分别调用了相应的recvfrom().
data_buffer缓冲区一个线程只有一份吧?多次接收?
数据拷贝走之后,data_buffer 在重用是没有任何问题的!