本次的試驗內容是unp第7章:套介面選項 。
「so_reuseaddr 套接字選項"
在前一次的實驗中,我就注意到,如果在步驟1中,不是kill掉向client提供服務的server子程序,而是kill掉監聽外部連線的server 父程序的話,並不影響client與其對端的通訊——這也符合在os教材中傳授的知識:"當程序被kill掉時,將其所有還在執行的子程序託管給自己的父 程序。「
「bind error: address already in use.」
問 題出在何處?通過netstat -an命令可以看到,之前與client建立的連線中,server子程序在port 9877上與client進行通訊,而現在要重新啟動的server父程序在呼叫bind函式時,也要繫結在port 9987 ——實際上,每個server父程序通過呼叫accept函式返回的socket都繼承了監聽socket的引數。
要解決這個問題,就需要在執行bind函式前,對套接字設定
so_reuseaddr屬性,關於該屬性的具體描述參見書中p179頁。
試驗**(對tcpserv04.c進行修改)
......................
listenfd
=socket(af_inet
,sock_stream,0
);int enable
=1;if( setsockopt(listenfd,sol_socket,so_reuseaddr,&enable,sizeof(enable) ) <0 )
printf("failed to setup the so_reuseaddr option "
);bind(listenfd
,(sa *)
&servaddr
,sizeof
(servaddr));
"so_linger 套介面選項「
該選項對close()函式所執行的操作進行設定。預設情況下,close()函式會立即返回至呼叫者;系統試圖將滯留在socket的傳送緩衝區中的資料傳送,並開始正常的tcp四分組連線終止序列。
在試驗1中,如果client正常退出,使用netstat -an命令,可以看到client的socket狀態為time_wait。
so_linger選項允許我們修改close()函式的預設操作。其中的一種可能是tcp丟棄滯留在socket的傳送緩衝區中的所有資料,並向對端傳送rst,不經過通常的tcp四分組連線終止序列,就直接關閉連線。
對試驗1中的tcpcli01.c進行如下修改
struct linger lin;
lin.l_onoff=1;
lin.l_linger=0;
setsockopt(sockfd,sol_socket,so_linger,&lin,sizeof
(lin) );
exit(0
); 再啟動server和client,連線建立後,client正常退出,此時執行netstat -an命令,可以看到輸出結果中不再有處於
time_wait狀態的client socket ——該socket對應的tcp連線已徹底關閉。
十年讀一書
這幾天不知怎麼搞的,總是關注有關閱讀的問題。看來,微博時代,碎片化資訊對人的影響真是太大了。現在,一有空就喜歡把手機拿出來,重新整理一下微博,看看又有啥新言論。偶爾看到精彩之處,還忍不住也要說兩句,或者 想和更多的人分享吧。然而,可能這事兒一過,下一會兒就不記得剛才看到什麼,說過什 麼了吧。真正成了...
讀書 飛魚576讀《程式設計師求職第一書》
首先感謝 leo的贈書 程式設計師求職第一書 在這個陽光明媚的下午,又細細品味了leo的新書。程式設計師求職第一書 講述了程式設計師在求職過程中有可能遇到的各類問題。比較全面的展示了求職的流程和招聘的過程。其實求職,最重要的是用誠懇的心態,來尋找適合雙方的機會。每乙個機會都是展示自我,了解別人的視窗...
關於C 類記憶體的一些小試驗
看了一些關於c 類記憶體的文章,有了一些粗淺的了解,來做幾個小試驗檢驗我自己的認知。試驗用計算機是64位的。理論上類記憶體的大小應該是非靜態資料成員的大小加上虛指標的大小再考慮記憶體對齊。先來乙個簡單的。class base base private int a char b 這個類有多大呢,64位...