各位高手,請教問題。小弟初學linux socket網路編程。在實作一個演算法,演算法要求是發送udp(1472位元組)報文,嚴格控制每個udp發送時間。舉個例子就是t1時間發送udp1,t2時間發送udp2,t3時間發送udp3。。。。差不多會發送幾百個包,t1,t2,t3之間的時間間隔是我(演算法)嚴格控制的。先不考慮系統呼叫對時間造成的干擾(在底層發包當然最快最準)。
我想要達到的效果是應用程式一個包發完,再發第二個包。。。第三個,第四個。但是上網了解到系統會自主等包,意思就是我雖然呼叫write函式發第一個包,但是其實包在內核里(或者什么其他地方或者網卡那)不是立馬發走,會等一段時間,然后一起發出去。(原因是不想浪費資源,一個包發一次調度一次太耗資源)。
比如舉個例子假設系統是每三秒發一次包。我1s鐘的時候調write函式發第一個包,2s鐘時調write函式發第二個包,3s鐘呼叫write函式發第三個udp包。但是其實在系統里,第一次調write后1號包在等2號包和3號包到了然后一起扔出去(因為等3s發一次。)。這就導致不是我想要的發包時間順序。1號包和2,3號包的發送時間是一樣的實際上。然后我統計時間戳也是一號包到達對端的時間最長,2號包3號包其次。而且每次都是這個結果。也印證了1號包在等2,3號包
有沒有什么方法可以讓系統不等包,立馬發? 上網查了1.呼叫fflush函式,說是可以立馬發送不等包。fflush(FILE * stream)函式如何跟udp socket介面配合用起來?貌似是寫檔案I/O時才能用的fflush函式。這個方法可行嗎?fflush函式如何和socket一起用?2.上網還搜到了關閉GSO功能,到底哪個比較好比較合適?謝謝大家!
uj5u.com熱心網友回復:
udp本來不就是基于包的協議嗎?uj5u.com熱心網友回復:
是啊,是基于包的。我的意思是內核會等包聚包。怎么讓內核不等包。uj5u.com熱心網友回復:
setsockopt(, ..SO_SNDBUF,..., 0) ?uj5u.com熱心網友回復:
fflush一般是在發前或者錯誤時這樣用的較多,如果你希望每次直接發,應該去設定快取區的大小,參考 三樓“Eleven版主”的回答。uj5u.com熱心網友回復:
1 #include "unp.h"
2 void
3 str_echo(int sockfd)
4 {
5 char line[MAXLINE];
6 FILE *fpin, *fpout;
7 fpin = Fdopen(sockfd, "r");
8 fpout = Fdopen(sockfd, "w");
9 while (Fgets(line, MAXLINE, fpin) != NULL)
10 Fputs(line, fpout);
11 }
大概是上面這段代碼的意思,一個簡單的例子,我可以加個fflush(fpout);類似的東西。不知各位大俠明白我的意思么
uj5u.com熱心網友回復:
你說的這個buffer是內核發送的buffer吧,這樣只是告訴socket立馬把資料copy到內核協議堆疊發送buffer吧。具體內核等包發還是不等立馬發,這兩者是不是沒有關系即setsockopt選項并沒有實際產生效果,可以這么理解么?uj5u.com熱心網友回復:
你說的這個buffer是內核發送的buffer吧,這樣只是告訴socket立馬把資料copy到內核協議堆疊發送buffer吧。具體內核等包發還是不等立馬發,這兩者是不是沒有關系即setsockopt選項并沒有實際產生效果,可以這么理解么?uj5u.com熱心網友回復:
setsockopt(, ..SO_SNDBUF,..., 0) 是正解 , Linger等待好像是tcp的事情吧,udp沒有等待一說,就算其他行程也在使用udp發送,和 你的udp并不會沖突或在干擾, 每個 socket緩沖都是獨立的 ,
你只要把發送緩沖設為0,那就是立即發送,當然有可能發送失敗發不出去,檢測回傳值
反正緩沖為0,系統就會立即送到IP層,但是失敗與否不可預測
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/67058.html
標籤:網絡編程
