做了乙個**tcp 和udp的服務端,但是現在測試老有問題,就是udp總會有那麼幾次超時,原因還沒找到,不過先總結一下網路的程式設計。
首先預設的狀態下,recvfrom和recv都是阻塞的狀態,也就是沒接收到會一直阻塞,知道返回,但是可以通過select設定超時:
timeval twait;
twait.tv_sec = 0;
twait.tv_usec = 1000000; // wait for 10000us
fd_set revset;
fd_zero(&revset);//清零
fd_set(acceptsocket, &revset); //將套接字加入描述符
int iresult = select(1, &revset, null, null, &twait);//在10ms內判斷對應的socket是否可讀,若刻度,立即返回套接字個數,若10ms內不可讀,則返回0,然後return,結束此函式。
if ( iresult == 0 )
else if ( socket_error == iresult )
現在初步的判斷是接受緩衝區的問題,不過對於緩衝區還有一點迷惑:
接受緩衝區是有資料就立即接受,但是傳送緩衝區是等最大500ms(好像是),然後將這個時間接到的所有資料一起傳送(非同步),或者乙個資料足夠大後直接傳送,這點我不是很確定。
緩衝區有資料就立刻傳送緩衝區的設定如下:
bool bnodelay=true;
setsockopt(acceptsocket,ipproto_tcp,tcp_nodelay,(const char*)&bnodelay,sizeof(bool));//緩衝區有資料就立刻傳送,ipproto_tcp選項是bool型,即費0則1,而sol_socket是實在的數,tcp_nodelay 禁止傳送合併的nagle演算法,其他類似的如下:
setsockopt()支援下列選項。其中「型別」表明optval所指資料的型別。
選項 型別 意義
so_broadcast bool 允許套介面傳送廣播資訊。
so_debug bool 記錄除錯資訊。
so_dontliner bool 不要因為資料未傳送就阻塞關閉操作。設定本選項相當於將so_linger的l_onoff元素置為零。
so_dontroute bool 禁止選徑;直接傳送。
so_keepalive bool 傳送「保持活動」包。
so_linger struct linger far* 如關閉時有未傳送資料,則逗留。
so_oobinline bool 在常規資料流中接收帶外資料。
so_rcvbuf int 為接收確定緩衝區大小。
so_reuseaddr bool 允許套介面和乙個已在使用中的位址**(參見bind())。
so_sndbuf int 指定傳送緩衝區大小。
tcp_nodelay bool 禁止傳送合併的nagle演算法。
setsockopt()不支援的bsd選項有:
選項名 型別 意義
so_acceptconn bool 套介面在監聽。
so_error int 獲取錯誤狀態並清除。
so_rcvlowat int 接收低階水印。
so_rcvtimeo int 接收超時。
so_sndlowat int 傳送低階水印。
so_sndtimeo int 傳送超時。
so_type int 套介面型別。
ip_options 在ip頭中設定選項。
記得以前有些朋友討論過,socket雖然send成功了,但是其實只是傳送到資料緩衝區裡面了,而並沒有真正的在物理裝置上傳送出去;而通過這條語句,將傳送緩衝區設定為0,即遮蔽掉傳送緩衝以後,一旦send返回(當然是就阻塞套結字來說),就可以肯定資料已經在傳送的途中了^_^,但是這樣做也許會影響系統的效能
to:sander()
udp也有拷貝過程,但是udp包有最大限制為64k;
tcp_nodelay 一般用在the normal data stream 上;
12.傳送資料時候一般是系統緩衝區滿以後才傳送,現在設定為只要系統
緩衝區有資料就立刻傳送:
bool bnodelay=true;
setsockopt(s,ipproto_tcp,tcp_nodelay,(const char*)&bnodelayt,sizeof(bool));
udp丟包是不可避免的,你可以把每個包用乙個字段標識,對一部分發兩遍,另外還有其他的方法,如包設定大小,傳送時注意sleep(n),n1-10等方法
q:本地同時與多個主機建立連線,如果這些主機同時發生資料到本地,而本地又沒有呼叫recv進行處理,會出現什麼情況?
a:系統為每個socket建立乙個快取,ip層組包程序在收到資料報後會把資料放入socket快取。呼叫recv將socket快取的內容copy到程式定義的快取,如果通訊程序不能及時recv,將導致該socket快取滿。如果用tcp協議,socket快取滿以後,系統會向對方發出錯誤訊息,對方**到wsaewouldblock錯誤,如果是用udp協議,系統會把該socket的以後收到的資料丟棄~
網路程式設計小結
memset mdataofcfg,0,sizeof mdataofcfg const char configfile debug config.cfg htons 把unsigned short型別從主機序轉換到網路序 htonl 把unsigned long型別從主機序轉換到網路序 ntohs ...
關於網路程式設計select小結
描述符讀就緒情況 1 套接字的讀緩衝大於低位標記so recvnowat 預設為1 2 監聽套接字監聽到新的連線 3 套接字接收到了fin訊號,read 0.4 套接字出錯,read 1 描述符寫就緒情況 1 套接字的寫緩衝大於低位標記so sendnowat 預設為2048 2 套接字接收到了fi...
網路程式設計(自用小結筆記)
一 實現網路通訊需要解決的兩個問題 二 網路通訊的兩個要素 三 通訊要素一 ip和埠號 1.ip的理解 四 通訊要素二 網路通訊協議 1.分類模型 2.tcp 和udp的區別 3.tcp三次握手和四次揮手 示例1 客戶端傳送資訊給服務端,服務端將資料顯示在控制台上 客戶端 test public v...