SOCKET 通訊原理

2021-06-23 01:33:30 字數 3149 閱讀 8288

源**:

基於tcp/ip協議的網路程式設計

定義變數——獲得winsock版本——載入winsock庫——初始化——建立套接字——設定套接字選項——關閉套接字——解除安裝winsock庫——釋放所有資源

整個程式架構分為兩大部分,伺服器端客戶端。

伺服器socket程式流程:

socket()→bind()→listen→accept()→recv()/send()→closesocket()

客戶端:

socket→bind()→connect()→send()/recv()→closesocket()

程式設計舉例:

約定傳送訊息的格式為如下結構體:

typedef struct

tcpmessage;

應用程式的標頭檔案如下:

#include

#pragma comment(lib,"ws2_32")

#include

埠號為:4500

伺服器端:

1、  初始化:

wsadata wsadata;

word sockversion = makeword(2, 2);

if(wsastartup(sockversion, &wsadata) != 0)

return 0;

2、  建立套接字:

socket slisten =socket(af_inet, sock_stream, ipproto_tcp);

if(slisten == invalid_socket)

3、  使套接字和本地位址繫結

// 在sockaddr_in結構中裝入位址資訊

sockaddr_in sin;

sin.sin_family = af_inet;

sin.sin_port = htons(4500); // htons函式將主機的無符號短整形數轉換成網路

//位元組順序

sin.sin_addr.s_un.s_addr =inaddr_any;

if(bind(slisten, (lpsockaddr)&sin, sizeof(sin)) == socket_error)

4、監聽埠

if(listen(slisten, 5)== socket_error)

5、等待接受連線,(如無連線,一直等待)

socket sclient;//用於儲存accept返回的套接字

sclient =accept

(slisten,0,0);//accept函式呼叫失敗則繼續等待連線。

if(sclient == invalid_socket)

6、用第5步中accept函式返回的套接字進行收發通訊

6.1、接收:(如果沒有接到,會等待!)

tcpmessagerevdata;//定義接收訊息的結構體變數

int ret=recv

(sclient,(char *)&revdata,sizeof(revdata),0);

if(ret>0)//說明,收到位元組

} 6.2、傳送:

tcpmessagesenddata;

memset((char*)&senddata,0,sizeof(senddata));//初始化為0

senddata.id=1;//為id成員變數賦值

strcpy(senddata.data,"\r\n..要傳送的字元資訊");

if(send(sclient,(char*)&senddata,sizeof(senddata),0)==socket_error)

7、關閉

closesocket(sclient);//由accept生成的套接字

closesocket(slisten);//服務端套接字

wsacleanup();

客戶端

1、   初始化

wsadata wsadata;

word sockversion = makeword(2, 2);

if(wsastartup(sockversion, &wsadata) != 0)

return 0;

2、   建立套接字

socket sclient = socket(af_inet, sock_stream, ipproto_tcp);

if(sclient == invalid_socket)

3、   使套接字和本地位址繫結

// 在sockaddr_in結構中裝入伺服器端位址資訊

sockaddr_in servaddr;

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(4500);// htons函式將主機的無符號短整形數轉換成網路

//位元組順序,4500埠為要連線伺服器端的埠

servaddr.sin_addr.s_un.s_addr =inet_addr("127.0.0.1");//伺服器端ip

4、   連線伺服器

if(connect(sclient,(sockaddr*)&servaddr,sizeof(servaddr))==socket_error)

//注意,要先把伺服器開啟,否則連線失敗

5、   收發通訊

用send和recv函式,這一點和伺服器端一樣

6、   關閉

closesocket(sclient);//客戶端只有乙個連線套接字

wsacleanup();

Socket 通訊原理

socket,又稱 套接字 網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端稱為乙個 socket。socket 的英文願意是 孔 或 插座 在 internet 上的主機一般執行了多個服務軟體,同時提供幾種服務。每種服務都開啟乙個 socket,並繫結到乙個埠上,不同的埠對應不...

Socket 通訊原理

socket 的中文翻譯過來就是 套接字 套接字是什麼,我們先來看看它的英文含義 插座。socket 就像乙個 插座,負責連通兩端的 進行點對點通訊,讓 可以進行通訊,埠就像插座上的孔,埠不能同時被其他程序占用。而我們建立連線就像把插頭插在這個插座上,建立乙個 socket 例項開始監聽後,這個 插...

Socket 通訊原理

socket是什麼呢?socket是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。不過socket...