設定socket描述符SO REUSEADDR屬性

2021-04-30 13:59:54 字數 589 閱讀 9448

在使用tcp連線方式的時候,當乙個繫結到指定埠的描述符主動斷開時,在這個埠上的連線將進入time_wait狀態,並且會等待2*msl時間才釋放。如果在這個時間內,需要再次繫結相同的指定的埠,就需要設定描述符的so_reuseaddr屬性,否則繫結會失敗。

char rep = 1;

setsockopt( skt, sol_socket, so_reuseaddr, &rep, sizeof(rep) );

這樣設定後,就可以在釋放後立刻重新繫結相同指定埠。

但這段程式搬到linux平台則執行不正常,setsockopt的時候返回值為-1出錯,在網上搜了一下,發現時這個rep引數的型別不對。修改程式如下:

int rep = 1;

setsockopt( skt, sol_socket, so_reuseaddr, &rep, sizeof(rep) );

這樣在linux平台下執行也就正確了。

具體為什麼需要rep定義為乙個int型別,目前還沒有深入去理解,但我猜測,在linux平台下,socket層他需要去判斷乙個四位元組的引數,而如果只是傳遞了乙個單位元組引數,那麼很可能判斷不正確,設定屬性就會異常。

需要求證。

Socket描述符解釋

因為套接字api最初是作為unix作業系統的一部分而開發的,所以套接字api與系統的其他i o裝置整合在一起。特別是,當應用程式要為網際網路通訊而建立乙個套接字 socket 時,作業系統就返回乙個小整數作為描述符 descriptor 來標識這個套接字。然後,應用程式以該描述符作為傳遞引數,通過呼...

Socket描述符選項 SOL SOCKET

socket描述符選項 sol socket include int setsockopt int socket,int level,int option name,const void option value,size t option len 第乙個引數socket是套接字描述符。第二個引數l...

socket描述符選項 SOL SOCKET

include int setsockopt int socket,int level,int option name,const void option value,size t option len 第乙個引數socket是套接字描述符。第二個引數level是被設定的選項的級別,如果想要在套接字...