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,用於與客...