在利用tcp/ip進行網路程式設計的時候,一定會涉及到setsockopt。這個函式可以自定義的設定一些socket的配置。這裡記錄一下相關配置,
1.closesocket(一般不會立即關閉而經歷time_wait的過程)後想繼續重用該socket:
bool breuseaddr=true;
setsockopt(s,sol_socket ,so_reuseaddr,(const char*)&breuseaddr,sizeof(bool));
2.如果要已經處於連線狀態的soket在呼叫closesocket後強制關閉,不經歷
time_wait的過程:
bool bdontlinger = false;
setsockopt(s,sol_socket,so_dontlinger,(const char*)&bdontlinger,sizeof(bool));
3.在send(),recv()過程中有時由於網路狀況等原因,發收不能預期進行,而設定收發時限:
int nnettimeout=1000;//1秒
//傳送時限
setsockopt(socket,sol_s0cket,so_sndtimeo,(char *)&nnettimeout,sizeof(int));
//接收時限
setsockopt(socket,sol_s0cket,so_rcvtimeo,(char *)&nnettimeout,sizeof(int));
4.在send()的時候,返回的是實際傳送出去的位元組(同步)或傳送到socket緩衝區的位元組
(非同步);系統預設的狀態傳送和接收一次為8688位元組(約為8.5k);在實際的過程中傳送資料
和接收資料量比較大,可以設定socket緩衝區,而避免了send(),recv()不斷的迴圈收發:
// 接收緩衝區
int nrecvbuf=32*1024;//設定為32k
setsockopt(s,sol_socket,so_rcvbuf,(const char*)&nrecvbuf,sizeof(int));
//傳送緩衝區
int nsendbuf=32*1024;//設定為32k
setsockopt(s,sol_socket,so_sndbuf,(const char*)&nsendbuf,sizeof(int));
5.如果在傳送資料的時,希望不經歷由系統緩衝區到socket緩衝區的拷貝而影響
程式的效能:
int nzero=0;
setsockopt(socket,sol_s0cket,so_sndbuf,(char *)&nzero,sizeof(nzero));
6.同上在recv()完成上述功能(預設情況是將socket緩衝區的內容拷貝到系統緩衝區):
int nzero=0;
setsockopt(socket,sol_s0cket,so_rcvbuf,(char *)&nzero,sizeof(int));
7.一般在傳送udp資料報的時候,希望該socket傳送的資料具有廣播特性:
bool bbroadcast=true;
setsockopt(s,sol_socket,so_broadcast,(const char*)&bbroadcast,sizeof(bool));
8.在client連線伺服器過程中,如果處於非阻塞模式下的socket在connect()的過程中可
以設定connect()延時,直到accpet()被呼叫(本函式設定只有在非阻塞的過程中有顯著的
作用,在阻塞的函式呼叫中作用不大)
bool bconditionalaccept=true;
setsockopt(s,sol_socket,so_conditional_accept,(const char*)&bconditionalaccept,sizeof(bool));
9.如果在傳送資料的過程中(send()沒有完成,還有資料沒傳送)而呼叫了closesocket(),以前我們
一般採取的措施是"從容關閉"shutdown(s,sd_both),但是資料是肯定丟失了,如何設定讓程式滿足具體
應用的要求(即讓沒發完的資料傳送出去後在關閉socket)?
struct linger ;
linger m_slinger;
m_slinger.l_onoff=1;//(在closesocket()呼叫,但是還有資料沒傳送完畢的時候容許逗留)
// 如果m_slinger.l_onoff=0;則功能和2.)作用相同;
m_slinger.l_linger=5;//(容許逗留的時間為5秒)
setsockopt(s,sol_socket,so_linger,(const char*)&m_slinger,sizeof(linger));
根據上述配置可以配置傳送快取區和接受快取區大小。但是設定後的真實快取區大小是多少呢?
(1)當設定的值val > 最大值sysctl_wmem_max,則設定為
最大值的2倍:2*sysctl_wmem_max;
(2)當設定的值的兩倍val*2
《最小值,則設定成最小值:sock_min_sndbuf;
(3)當設定的值val < 最大值sysctl_wmem_max,且 val*2> sock_min_sndbuf, 則設定成2*val。
存放接收緩衝區最大值的位置:
/proc/sys/net/core/rmem_max:
結果:4194304
//4m
存放傳送緩衝區最大值的位置:
/proc/sys/net/core/wmem_max:
結果:8388608 //8m
做乙個簡單的測試:
講緩衝區大小設為1024*100那麼結果應該是它的2倍即204800,結果如圖:
setsockopt常用設定
1.如果在已經處於 established狀態下的socket 一般由埠號和標誌符區分 呼叫closesocket 一般不會立即關閉而經歷time wait的過程 後想繼續重用該socket bool breuseaddr true setsockopt s,sol socket so reusea...
方形快取區
如何製作點的方形快取區 之前收到客戶的需求,需要製作點圖層的方形快取區。但是在 arcgis 中並沒有提供方形快取區,只能通過 buffer 工具製作圓形快取區。那麼如何生成方形快取區呢,莫非需要 engine 寫程式根據點座標尋找方形快取區的四角座標,然後再生成正方形要素嗎?太麻煩了吧。接下來看看...
關於快取區
c語言裡面的stdio.h庫函式裡涉及到了快取區,具體案例是這樣的 includestructuser int main int argc,const char argv 我輸入了 zhangsan 12 w 意思為 名張三 12歲 是個女的 woman 但是列印的是 zhangsan pass a...