setsockopt是用來設置socket的屬性。
setsockopt設置SO_REUSEADDR。
socket關閉之后并不會立即收回,而是要經歷一個TIME_WAIT的階段。windows下最多可以達到4分鐘。
所以在這個時候對這個端口進行重新綁定就會出錯。所以需要先設置 SO_REUSEADDR.
或者在closesocket的時候,使用setsockopt設置SO_DONTLINGER。也不會有TIME_WAIT的階段.
通常使用這個設置來加強網絡程序的健壯性。
下面是別處補充的資料:
1. 如果在已經處于 ESTABLISHED狀態下的socket(一般由端口號和標志符區分)調用
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 {
u_short l_onoff;
u_short l_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));
Note:1.在設置了逗留延時,用于一個非阻塞的socket是作用不大的,最好不用;2.如果想要程序不經歷SO_LINGER需要設置SO_DONTLINGER,或者設置l_onoff=0;
10.還一個用的比較少的是在SDI或者是Dialog的程序中,可以記錄socket的調試信息:
(前不久做過這個函數的測試,調式信息可以保存,包括socket建立時候的參數,采用的
具體協議,以及出錯的代碼都可以記錄下來)
BOOL bDebug=TRUE;
setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
什么是土地儲備貸款?土地儲備貸款是銀行向土地儲備機構發放的用于收購、整治土地,提升土地出讓價值的短期周轉貸款。其主要用途包括支付征地補償費、安置補助費、地上附著物和青苗補償費、場地平整費、繳納土地出讓金等。向借款人發放的用于土地收購及土地前期開發、整理的貸款。土地儲備貸款的條件是什么?(1)借款人已取得企業(營業)法人資格,已辦理營業執照,年檢合格。(2)貸款申請人所在地方政府建立了土地儲備管理制...
炒黃金賺錢嗎?答案是肯定的。知道了黃金長期以來被人們作為投資工具,知道了黃金直到現在在位置,仍然有很大的投資價值我們不需要懷疑在黃金投機的賺錢能力當然我們要確定我們是在正規的黃金交易平臺上交易,剩下的只要操作得當就可以了。即使普通人也可以在黃金,炒股賺錢,但具體盈利情況取決于不同人的實際操作。炒黃金賺錢的幾率有多大?黃金市場如戰場,資金如士兵,而投資者就是這場交易中的指揮官,指揮官指導這場沒有硝煙...
所謂價格歧視,是指壟斷廠商為了獲得超額利潤,而實行的有差別的價格政策。價格其實分為三個等級,等級數字越小,壟斷廠商賺取的超額利潤就越多。價格歧視的三種類型例子如下:一、一級價格歧視-看人定價不同的人為相同商品或服務所愿意支付的最高價格是不同的。一個旅游紀念品,經濟條件好的人可能愿意花500元去購買,經濟條件一般的人可能最多只愿意出300元。那么為了多掙錢,景區賣旅游紀念品的老板會上下打量每一個詢價...