1.
重用已使用的位址
問題描述:在剛剛關閉了測試程式後,再啟動伺服器時提示bind失敗,返回錯誤eaddrinuse。
原因分析:套接字(主動關閉一端)在關閉套接字後會停留在time_wait狀態一端時間,由於我在同一機器上同時執行客戶端與伺服器,故伺服器在重新啟動執行bind時,可能上次關閉連線還沒有完成,連線依然存在,故bind失敗。通過設定套介面的so_reuseaddr可重用已繫結的位址,通常所有的tcp伺服器都應該指定本套介面選項。具體方法為:
int flag = 1;
setsockopt(sock, sol_socket, so_reuseaddr, &flag,
sizeof(flag));
2.io位址復用
直接呼叫read/write讀寫套介面和先呼叫select/poll在呼叫read/write都屬於阻塞io,只不過前者阻塞在讀寫系統呼叫上,而者阻塞在select/poll上。由於select需要兩個系統呼叫,io復用還稍有劣勢,使用select/poll的優勢在於我們可以等待多個描述字就緒。
io復用的程式設計模型通常為:(以poll為例,應用例項請參考unp第158頁)
1.建立乙個pollfd結構陣列,陣列長度為程序可能開啟的最大描述符個數,可簡單的使用open_max。2.
置陣列的第乙個元素為監聽套接字的就緒條件,並將其它的元素都清空。
3.呼叫poll,等待poll返回。
4.對於每乙個已就緒的描述字:
l如果是監聽描述字,則呼叫accept,得到連線描述字,並在pollfd陣列第乙個空位中加入連線描述字的就緒條件,並將就緒描述字數目減1,當減到0時轉到3。
l如果是連線描述字,則接受來自該描述字的請求資訊,並傳送響應資訊,將該描述字從pollfd陣列中移除,並將就緒描述字數目減1,當減到0時轉到3。
3.
同一位址啟動tcp與udp服務
1.建立tcp套接字,並繫結位址。
2.建立udp套接字,並繫結位址。
3.呼叫select/poll檢查tcp、udp套接字是否就緒。
l如果tcp套接字可讀,則呼叫accept獲取連線套接字,讀取並響應請求。
l如果udp套接字可讀,則直接讀取請求,並傳送響應。
具體應用例項參見unp第223頁。
Socket程式設計小結
本部分內容是對之前部落格 ubuntu下進行socket程式設計 中的補充說明,在這篇部落格中,我將詳細解釋socket程式設計的 分析程式設計的流程和思想。宣告 本部分 分別引用自 linux c socket程式設計原理及簡單例項 以及 linux網路程式設計 socket檔案傳輸範例 首先我們...
續例項解析SOCKET程式設計模型之非同步通訊篇(下)
非同步客戶端套接字在等待網路操作完成時不掛起應用程式。相反,它使用標準 net framework 非同步程式設計模型在乙個執行緒上處理網路連線,而應用程式繼續在原始執行緒上執行。非同步套接字適用於大量使用網路或不能等待網路操作完成才能繼續的應用程式。socket 類遵循非同步方法的 net fra...
LInux下的網路程式設計 七續 socket選項
這兩個選項分別表示了tcp接收緩衝區和傳送緩衝區的低水位標準,一般在i o復用時判斷socket可讀還是可寫。當tcp接收緩衝區的可讀資料大於其低水位標準時,i o復用系統通知應用程式可以從socket上讀取資料 tcp傳送緩衝區的空閒空間大於其低水位標準,i o復用系統通知向socket上寫資料。...