我的程序收到一些UDP消息,每个消息都是由客户端点击鼠标发送的。该程序的主线程(GUI)仅用于设置一些参数,第二个线程用
创建CreateThread(NULL, 0, MyFunc, &Data, 0, &ThreadTd);
正在侦听UDP数据包。 这是MyFunc:
...
sd=socket(AF_INET, SOCK_DGRAM, 0);
if(bind(sd,(struct sockaddr *)&server,sizeof(struct sockaddr_in))==-1)
....
while(true){
bytes_received=recvfrom(sd,buffer,BUFFER_SIZE,0,(struct sockaddr *)&client,&client_length);
//parsing of the buffer
}
为了证明没有数据包丢失,如果我使用了一个简单的脚本来侦听我的客户端使用某个端口发送的UDP消息,那么我的计算机就会收到所有发送的数据包。 当我运行我的应用程序时,只要客户端第一次单击鼠标,就会收到UDP消息,但是如果我尝试发送其他消息(其他鼠标点击),则服务器不接收它们(就像他没有接收到的那样) t抓住它们)和客户端,用户必须在服务器捕获消息之前至少单击2次。 主线程并不是一直忙,第二个线程只解析传入的消息,增强了一些变量,我没有为线程分配任何优先级。
任何建议?
答案 0 :(得分:2)
除了mark的建议,您还可以使用wireshark / netcat查看数据报发送的时间/地点
答案 1 :(得分:0)
这可能是与套接字编程有关的问题。我建议将select()
或epoll()
的来电与recvfrom()
的来电联系起来。这是一种更标准的套接字编程方法。这样,UDP服务器就可以从多个客户端接收消息,并且无法无限期地阻止。
此外,如果问题是客户端并不总是为每次点击发送数据包,或者如果服务器不总是收到它们,则应该隔离。 Wireshark可以帮助查看何时发送数据包。
答案 2 :(得分:0)
没有足够的信息知道为什么会丢包。在到达第一个recvfrom之前,接收线程是否有延迟?调试跟踪可能指明方向。我还假设struct sockaddr服务器在调用bind()之前填充了一些理智的东西?你没有展示那部分...
答案 3 :(得分:0)
如果我正确理解了您的问题,那么您的线程服务器应用程序在快速突发发送时不会收到所有数据包。您可以尝试的一件事是在服务器端增加套接字接收缓冲区,因此当您的应用程序没有足够快地读取它时,可以将更多数据排队。请参阅setsockopt
,使用SO_RCVBUF
选项。