C C socket程式設計學習筆記

2021-07-30 21:39:47 字數 4588 閱讀 7122

socket 是「套接字」的意思,是計算機之間進行通訊的一種約定,也可以認為是一種技術。學習 socket,就是學習計算機之間如何通訊,並能夠用程式語言開發出實用的程式。

同時學習linux和windows的原因——大多數專案是在linux下開發伺服器端,而在windows下開發客戶端,需要經常在兩大平台之間進行切換,單獨學習一種平台沒有實踐意義。

網路程式設計就是編寫程式使兩台聯網的計算機相互交換資料。

在計算機通訊領域,socket 被翻譯為「套接字」,它是計算機之間進行通訊的一種約定或一種方式。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。

web伺服器: 就是指**伺服器。簡單的說.就是用來放**資料的伺服器。乙個**上面所有的文字、等統稱為資料.這些資料並不是憑空的出現在網路中的。而是在後台有乙個伺服器支撐.當使用者訪問**時.其實是通過網路向伺服器傳送了乙個請求。伺服器再將使用者請求的頁面反饋到使用者這裡。這個時候使用者才可以看到**精美的介面。而web器就是這個在後台提供資料服務的伺服器。

那什麼是伺服器呢?

通俗理解:伺服器其實就是網路環境中的高效能計算機(可以想成是一台式電腦),同樣有硬碟、主機板、cpu等基本硬體,只是他不同於我們普通計算機,他儲存海量資料,並能高速度運算,承受高數量的併發訪問(就是好多人同一時間訪問,他能將資料一同發向每乙個訪問的客戶),這些資料呢你可以想成是水分子,不難想象,當同一時間訪問的客戶多了,自然單位時間ms內傳送水分子就多,那麼需要承載這些水分子的渠道就要隨著增寬,否則的話就會造成堵塞,然後訪問伺服器的這些客戶的網頁就會出現「卡」的現象,所以為了保證客戶訪問伺服器不會出現的堵塞的現象,那麼我們需要的「水渠」就是寬頻就要足夠寬。那麼像咱們一般的機房寬頻呢是達不到那麼大。 另外,伺服器高速運轉,散熱,輻射等方面都非普通計算機能比,所以為了更有利於伺服器的「生存」,就要選擇更適合伺服器的生存環境來放置伺服器,故而就出現了伺服器的託管,

學習 socket,也就是學習計算機之間如何通訊,並編寫出實用的程式。

ip位址(ip address)

計算機分布在世界各地,要想和它們通訊,必須要知道確切的位置。確定計算機位置的方式有多種,ip 位址是最常用的,例如,114.114.114.114 是國內第乙個、全球第三個開放的 dns 服務位址,127.0.0.1 是本機位址。

其實,我們的計算機並不知道 ip 位址對應的地理位置,當要通訊時,只是將 ip 位址封裝到要傳送的資料報中,交給路由器去處理。路由器有非常智慧型和高效的演算法,很快就會找到目標計算機,並將資料報傳遞給它,完成一次單向通訊。

目前大部分軟體使用 ipv4 位址,但 ipv6 也正在被人們接受,尤其是在教育網中,已經大量使用。

埠(port)

有了 ip 位址,雖然可以找到目標計算機,但仍然不能進行通訊。一台計算機可以同時提供多種網路服務,例如web服務、ftp服務(檔案傳輸服務)、smtp服務(郵箱服務)等,僅有 ip 位址,計算機雖然可以正確接收到資料報,但是卻不知道要將資料報交給哪個網路程式來處理,所以通訊失敗。

為了區分不同的網路程式,計算機會為每個網路程式分配乙個獨一無二的埠號(port number),例如,web服務的埠號是 80,ftp 服務的埠號是 21,smtp 服務的埠號是 25。

埠(port)是乙個虛擬的、邏輯上的概念。可以將埠理解為一道門,資料通過這道門流入流出,每道門有不同的編號,就是埠號。如下圖所示:

協議(protocol)

協議(protocol)就是網路通訊的約定,通訊的雙方必須都遵守才能正常收發資料。協議有很多種,例如 tcp、udp、ip 等,通訊的雙方必須使用同一協議才能通訊。協議是一種規範,由計算機組織制定,規定了很多細節,例如,如何建立連線,如何相互識別等。

協議僅僅是一種規範,必須由計算機軟體來實現。例如 ip 協議規定了如何找到目標計算機,那麼各個開發商在開發自己的軟體時就必須遵守該協議,不能另起爐灶。

所謂協議族(protocol family),就是一組協議(多個協議)的統稱。最常用的是 tcp/ip 協議族,它包含了 tcp、ip、udp、telnet、ftp、smtp 等上百個互為關聯的協議,由於 tcp、ip 是兩種常用的底層協議,所以把它們統稱為 tcp/ip 協議族。

資料傳輸方式

計算機之間有很多資料傳輸方式,各有優缺點,常用的有兩種:sock_stream 和 sock_dgram。

1) sock_stream 表示面向連線的資料傳輸方式。資料可以準確無誤地到達另一台計算機,如果損壞或丟失,可以重新傳送,但效率相對較慢。常見的 http 協議就使用 sock_stream 傳輸資料,因為要確保資料的正確性,否則網頁不能正常解析。

2) sock_dgram 表示無連線的資料傳輸方式。計算機只管傳輸資料,不作資料校驗,如果資料在傳輸中損壞,或者沒有到達另一台計算機,是沒有辦法補救的。也就是說,資料錯了就錯了,無法重傳。因為 sock_dgram 所做的校驗工作少,所以效率比 sock_stream 高。

注意:sock_dgram 沒有想象中的糟糕,不會頻繁的丟失資料,資料錯誤只是小概率事件。

有可能多種協議使用同一種資料傳輸方式,所以在 socket 程式設計中,需要同時指明資料傳輸方式和協議。

綜上所述:ip位址和埠能夠在廣袤的網際網路中定位到要通訊的程式,協議和資料傳輸方式規定了如何傳輸資料,有了這些,兩台計算機就可以通訊了。

先編譯執行服務端server.exe,然後再編譯執行客戶端client.exe

//服務端server.c

#include

#include

#pragma comment (lib, "ws2_32.lib") //載入 ws2_32.dll

int main(int argc, char *argv)

//繫結套接字

struct sockaddr_in sockaddr;

memset(&sockaddr, 0, sizeof(sockaddr)); //每個位元組都用0填充

sockaddr.sin_family = pf_inet; //使用ipv4位址

sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具體的ip位址

sockaddr.sin_port = htons(1234); //埠

if(bind(servsock, (sockaddr*)&sockaddr, sizeof(sockaddr)) == socket_error)

//進入監聽狀態

listen(servsock, 20);

//迴圈接收客戶端請求

int nsize = sizeof(sockaddr);

char *str = "hello, i come from mars.\n";

sockaddr clntaddr;

socket clntsock;

for(;;)

//向客戶端傳送資料

send(clntsock, str, strlen(str)+sizeof(char), 0);

}//關閉套接字

closesocket(clntsock);

closesocket(servsock);

//終止 dll 的使用

wsacleanup();

return

0;}

//客戶端client.c

#include

#include

#include

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

int main(int argc, char *agrv)

//向伺服器發起請求

struct sockaddr_in sockaddr;

memset(&sockaddr, 0, sizeof(sockaddr)); //每個位元組都用0填充

sockaddr.sin_family = pf_inet;

sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

sockaddr.sin_port = htons(1234);

if(connect(sock, (sockaddr*)&sockaddr, sizeof(sockaddr)) == -1)

//接收伺服器傳回的資料

char szbuffer[maxbyte] = ;

int nrecv = recv(sock, szbuffer, maxbyte, 0);

if(nrecv > 0)

//關閉套接字

closesocket(sock);

//終止使用dll

wsacleanup();

printf("\npress enter to exit.\n");

getchar();

return

0; }

linux下C C socket程式設計

簡單的linux下socket程式設計,分別基於tcp和udp協議實現的簡單程式 linux下socket程式設計可以概括為以下幾個函式的運用 流程 server include include include include include int main int argc,char argv ...

C C socket網路程式設計掃盲篇

socket 是 套接字 的意思,是計算機之間進行通訊的一種約定,也可以認為是一種技術。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。學習 socket,就是學習計算機之間如何通訊,並能夠用程式語言開發出實用的程式。計算機分布在世界各地,要想和它們通訊...

C C socket網路程式設計掃盲篇

socket 是 套接字 的意思,是計算機之間進行通訊的一種約定,也可以認為是一種技術。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。學習 socket,就是學習計算機之間如何通訊,並能夠用程式語言開發出實用的程式。計算機分布在世界各地,要想和它們通訊...