簡體   English   中英

線程監聽UDP問題

[英]Thread listening to UDP problems

我的程序收到一些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次。 主線程一直不忙,第二個線程只解析傳入的消息,增強了一些變量,我沒有為線程分配任何優先級。

任何建議?

除了mark的建議,你還可以使用wireshark / netcat來查看數據報發送的時間/地點

這可能是與套接字編程有關的問題。 我建議通過調用recvfrom()來調用select()epoll() recvfrom() 這是一種更標准的套接字編程方法。 這樣,UDP服務器可以從多個客戶端接收消息,並且它不會無限期地阻塞。

此外,如果問題是客戶端並不總是為每次點擊發送數據包,或者如果某種方式服務器不總是接收它們,則應該隔離。 Wireshark可以幫助查看何時發送數據包。

沒有足夠的信息知道為什么會丟包。 在到達第一個recvfrom之前,接收線程是否有延遲? 調試跟蹤可能指明方向。 我還假設struct sockaddr服務器在調用bind()之前填充了一些理智的東西? 你沒有展示那部分......

如果我正確理解您的問題,您的線程服務器應用程序在快速突發發送時不會收到所有數據包。 您可以嘗試的一件事是在服務器端增加套接字接收緩沖區,因此當您的應用程序沒有足夠快地讀取它時,可以將更多數據排隊。 請參閱setsockopt ,使用SO_RCVBUF選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM