基於TCP的socket通訊過程及例子

2021-08-27 15:46:24 字數 2379 閱讀 8097

socket 通訊的一般過程:

阻塞socket(同步socket)

程序或執行緒執行到某些socket函式時必須等待該socket事件的發生,如果該事件沒有發生,socket函式不能立即返回,程序或執行緒被阻塞。

特點:使用簡單,適合一對一的應答場合,在服務端很少使用,或配合多執行緒使用

函式返回值說明阻塞情況

accept()

返回新的連線socket控制代碼。

緩衝區佇列沒有新的等待連線

connect()

返回-1說明連線失敗,其他正常。

連線過程阻塞。

recv()

返回值小於1代表接收失敗,其他代表接收資料的長度。

傳送緩衝區有資料等待傳送完成,或接收緩衝區沒資料時阻塞。

send()

返回-1代表傳送失敗,其他為傳送資料的長度

傳送緩衝區沒有足夠空間儲存此次傳送資料時阻塞

非阻塞socket(非同步socket)

程序或執行緒執行socket函式時不必非要等待該socket事件的發生,一旦執行立即返回。根據返回值的不同可以判斷函式的執**況,如果事件發生則與阻塞方式相同,若事件沒有發生則返回乙個**來告知事件未發生,而程序或執行緒可以不被阻塞,繼續執行。

特點:函式執行立即返回,不會阻斷程序,效能比阻塞高,適合在主線程直接呼叫,不會造成主線程卡頓現象

因為socket預設是阻塞的,所以要設定非阻塞模式:

#ifdef win32 

dword nmode = 1;

ioctlsocket(m_sock, fionbio, &nmode);

#else

int r = fcntl(fd, f_getfl, 0));

fcntl(fd, f_setfl, r|o_nonblock);

#endif

tcp與udp 的區別協議說明socket建立tcp傳輸控制協議,可靠的連線服務。雙方先建立連線再傳輸資料。提供超時重發,資料檢驗,流量控制等機制,保證資料傳送無誤。

socket(af_inet, sock_stream, ipproto_tcp)

udp使用者資料報協議,不可靠的連線服務。沒有建立連線就可以傳送資料,沒有超時重發機制,傳輸速度很快。

socket(af_inet, sock_dgram, ipproto_udp)

socket例子

下面以乙個簡單例子來說明服務端與客戶端的互動過程

服務端 server.cpp

#include #include #pragma comment(lib, "ws2_32.lib")

#define port 8080

int main()

; //接受客戶端連線

socket client = accept(sock, (struct sockaddr*)&addr, &len);

char* ip = inet_ntoa(addr.sin_addr);

printf("accept client: %s\r\n", ip);

//接收客戶端資料

if(recv(client, buf, 1024, 0) >0)

closesocket(client);

} //關閉socket

closesocket(sock);

//關閉winsock服務

wsacleanup();

return 0;

}

客戶端 client.cpp

#include #include #pragma comment(lib, "ws2_32.lib")

#define remote_ip "127.0.0.1"

#define remote_port 8080

int main()

; if(recv(sock, buf, 1024, 0) >0)

} }else

//關閉socket

closesocket(sock);

//關閉winsock服務

wsacleanup();

getchar();

return 0;

}

基於TCP的Socket通訊

在win32平台上的winsock程式設計都要經過下列步驟 定義變數 獲得windock版本 載入winsock庫 初始化 建立套接字 設定套接字選項 關閉套接字 解除安裝winsock庫 釋放資源 1 建立乙個socket,用函式socket int socket int domain,int t...

基於tcp的socket通訊

socekt是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它 把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議 socket 基於檔案型別的套接字家...

基於TCP協議的socket通訊

一 伺服器端 1 建立serversocket,即伺服器端的socket,繫結指定的埠,並偵聽此埠 serversocket server new serversocket 8888 2 呼叫accept 方法,開始偵聽,等待客戶端的連線,在未連線成功之前,處於阻塞狀態,返回的socket,用於與客...