服務端socket重用屬性設定

2022-07-20 06:09:11 字數 2464 閱讀 4798

socket是一種系統資源,並不是每次初始化都一定成功,因此為了避免初始化失敗,一般使用多次初始化的方式,如下所示:

unsigned int times = 0x0

;while((server = socket(pf_inet6, sock_stream, 0)) < 0 && times < 0x3

)

一般來說,乙個埠釋放後需要等待兩分鐘左右才能被再次使用,so_reuseaddr是讓埠釋放後立即就可以被再次使用。例如:乙個程序監聽乙個埠,程序在某個時候異常重啟了,如果socket沒有設定可重用屬性,那麼程序重啟後就會出現bind錯誤,因為同乙個埠兩次監聽的時間間隔需要75秒;如果設定了可重用屬性,那麼同乙個埠釋放之後馬上就可以再次使用,如下所示:

int reuse = 0x0

;result = setsockopt(server, sol_socket, so_reuseaddr, (char *)&reuse, sizeof(int

));if(result != 0

)

tcp是一種面向連線的協議,因此需要實時檢查連線是否正常,特別是在上層長時間無資料傳輸時。一般檢查連線是否正常的方式是提供乙個保活機制,即定時的傳送一種探測報文,可以是上層自己傳送,也可以使用socket自己提供的保活機制,也就是保活屬性,但是socket自己提供的保活機制一般不可靠,或者說是不完全可靠,因此在實際程式設計中是兩種同時使用。首先上層啟用乙個任務,定時傳送檢測報文,然後設定socket的保活屬性,以期達到完全可靠,如下所示:

int optval = 0x1

;result = setsockopt(server, sol_socket, so_keepalive, (char*)&optval, sizeof(int

));if(result != 0

)

呼叫send和recv介面運算元據時,是直接將資料拷貝到緩衝區或是從緩衝器拷貝資料,如果快取區滿了,溢位後就會丟失資料,因此合理的設定快取區的大小很重要,注意傳送緩衝區和接收緩衝區是兩個快取區,不是同乙個。如下所示:

int bufsize = 32 * 1024

;result = setsockopt(isocketserver, sol_socket, so_sndbuf, (char *)&bufsize, sizeof

(bufsize));

if(result!= 0

)int bufsize = 32 * 1024

;result = setsockopt(isocketserver, sol_socket, so_rcvbuf, (char *)&bufsize, sizeof

(bufsize));

if(result != 0

)

如果socket作為服務端,那麼必須的操作是繫結乙個ip,且繫結時並不是一定就會成功,因此使用多次繫結的方法,如下所示:

struct sockaddr_in6 serverip_v6 = ;

memset(&serverip_v6, 0x0, sizeof(struct

sockaddr_in6));

serverip_v6.sin6_family =af_inet6;

serverip_v6.sin6_port = htons(9999

);serverip_v6.sin6_addr =in6addr_any;

times = 0

;while((result = bind(server, (struct sockaddr *)&serverip_v6, sizeof(struct sockaddr_in6))) != 0 && times < 0x3

)

同繫結socket的操作,注意最大監聽個數的選擇,如下所示:

times = 0

;listenmax = 0x10

;while ((lresultcode = listen(server, listenmax)) != 0 && times < 0x3

)

服務端一切設定好之後,就需要呼叫accpet阻塞式等待客戶端來連線,如下所示:

struct sockaddr_in6 managerip_v6 = ;

int addrlen = sizeof(struct

sockaddr_in6);

while(1

)

//注意:ip是managerip_v6.sin6_addr中的12、13、14、15位

//如:managerip_v6.sin6_addr[12]、managerip_v6.sin6_addr[13]、managerip_v6.sin6_addr[14]、managerip_v6.sin6_addr[15]

//注意:埠號是htons(managerip_v6.sin6_port)

//進行資料通訊

}

服務端socket程式

socket是一種ipc方法,本文實現乙個簡單的服務端例程,用於了解socket程式框架。socket函式用於建立套接字。bind函式用於分配ip位址和埠號。listen函式將套接字轉為可接收連線狀態。accept函式受理連線請求。如果在沒有連線的情況下呼叫該函式,則不會返回,直到有連線請求為止。c...

服務端通訊設定

wcf中 securitymode 安全機制 成員名稱 說明none 禁用安全性。transport 使用安全傳輸 例如 https 提供安全性。message 使用 soap 訊息安全提供安全性。transportwithmessagecredential 安全傳輸 例如 https 會提供完整性...

服務端 客戶端Socket通訊

服務端 using system using system.collections.generic using system.net using system.net.sockets using system.text using system.text.regularexpressions usi...