开一个线程只调用recvfrom(),然后存放数据,接收到的数据比 wireshark 抓到的包少,怎么回事?
void recvThread()
{
while (1)
{
rn = recvfrom(buffer);
if (rn > 0) memcpy(data, buffer, rn);
}
}
我试过包大小1k 间隔1ms或更小 那样的设置是没有问题的,问题就出在包比较大发送又很快的时候 就出现那样的情况
会不会和udp底层的发送接收机制有关系 导致recvfrom一段时间不能接收的 会不会是ip分片 却没有组包完成 所以阻塞在那了 <却又没有错误反馈??额>
--.最后各位大大有没有啥方法能提升udp可靠传输效率的方法
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().
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缓冲区一个线程只有一份吧?多次接收?