套接字程式設計原理及例程

2021-08-03 13:45:28 字數 4250 閱讀 4409

套接字:英文為socekt,是乙個指向傳輸提供者的控制代碼。

套接字分為:原始套接字、流式套接字和資料報套接字三種。

原始套接字:能夠給是程式開發人員對底層的網路傳輸機制進行控制,在原始套機子下接收的資料匯中含有ip頭;

流式套接字:提供雙向、有序、可靠的資料傳輸服務,該型別套接字在通訊前需要雙方建立連線,大家熟悉的tcp協議採用的就是流式套接字;

資料報套接字:與流式套接字對應,提供雙向的資料流,但是它不保證資料傳輸的可靠性、有序性和五重複性,udp協議採用的就是資料報套接字。

#include 

#include

int socket(int domain,int type,int protocol);

引數說明:

int domain:代表所使用的協議族,通常為af_inet,表示網際網路協議族(tcp/ip協議族);

int type:指定套接字的型別,sock_stream(流式套接字)、sock_dgram(資料報套接字)、sock_raw(原始套接字);

int protocol:通常賦值「0」。

返回值:返回乙個整形socket描述符,可在後面的函式呼叫中使用。

呼叫socket()函式時,套接字執行體將建立乙個套接字,也就是為乙個套接字資料結構分配儲存空間

通用的套接字資料結構的定義如下:

struct sockaddr

;

成員變數sa_family一般為af_inet代表tcp/ip(網際網路絡)位址族;

成員變數sa_data[14] 包含該套接字的ip位址和埠號。

不同的網路協議使用的結構體不一樣,但都以通用結構體」sockaddr」+」「,即socketaddr開頭,後面加上不同協議的字尾即可,例如嘗試用的ipv4對應的sockaddr_in資料結構如下:

struct sockaddr

;

#include 

#include

int bind(int sockfd,const

struct sockaddr *my_addr,socklen_t addrlen);

引數說名:

sockfd: 呼叫socket()函式返回的套接字描述符;

my_addr:是乙個執行包含有本機ip位址及埠等資訊的sockaddr型別的指標;

addrlen:通常被設定為結構體struct sockaddr的長度,即sizeof(struct sockaddr)。

my_addr.sin_port = 0

; /*系統隨機選擇乙個未被使用的埠號*/

my_addr.sin_addr.s_addr = inaddr_any; /*填入本機ip位址*/

#inclued 

uint32_t htonl(uint32_t hostlong); /*把32位值從主機位元組序轉換成網路位元組序*/

uint16_t htons(uint16_t hostshort); /*把16位值從主機位元組序轉換成網路位元組序*/

uint32_t ntohl(uint32_t netlong); /*把32位值從網路位元組序序轉換成主機位元組*/

uint16_t ntohs(uint16_t netshort); /*把16位值從網路位元組序序轉換成主機位元組*/

#include 

#include

int connect(int sockfd,const

struct sockaddr *serv_addr,socklen_t addrlen);

引數說明:

sockfd:是socket()函式返回的套接字描述符;

serv_addr:是包換遠端主機ip位址和埠號的sockaddr型別的指標;

- 監聽模式

函式listen()使套接字處於被動的監聽模式,並為該套接字建立乙個輸入資料佇列,將到達的服務請求儲存在此佇列中,直到程式對它們進行處理。

#include 

int listen(int sockfd,int backlog);

引數說明

sockfd:socket()函式返回的套接字描述符;

backlog:指定在請求佇列中允許的最大請求數,進入的連線請求將在佇列中等待accept()等系統呼叫的操作。

- 接收請求

accept()函式讓伺服器接受客戶的連線請求。函式定義:

#include 

#include

int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

引數說明

sockfd:是sockfd()函式返回的套接字描述符;

addr:通常是乙個指向sockaddr_in變數的指標,該變數用來存放提出連線請求服務的主機的資訊;

addrlen:通常為乙個指向值為sizeof(struct sockaddr_in)的整型指標變數。

- 資料傳輸

send()和recv()函式用於在面向連線的套接字上進行資料傳輸。

send()函式的定義形式如下:

#include 

#include

ssize_t send(int sockfd,const

void *msg,size_t len,int flags);

引數說明

sockfd:是socket()函式返回的套接字描述符;

msg:是乙個指向要傳送資料的指標;

len:是以位元組為單位的資料的長度;

flag:一般情況下設定為0。

send()函式返回實際上傳送出的位元組數,在程式中應該將send()的返回值與想要傳送的位元組數進行比較,當send()返回值與len不匹配時,應該對這種情況進行處理。

recv()函式的定義形式如下:

#include 

#include

ssize_t recv(int s,void *buf,size_t len,int flags);

引數說明

s:是socket()函式返回的套接字描述符;

buf:是存放接受資料的緩衝區;

len:是緩衝的長度;

flags:一般情況下設定為0。

函式sendto()和recvfrom()用於在無連線的資料報套接字方式下進行資料傳輸。由於本地套接字並沒有與遠端機器建立連線,所以在傳送資料是應指明目的位址。

- 結束傳輸

資料操作結束後,就可以呼叫close()函式來釋放該套接字,從而停止在該套接字上的任何資料操作,該函式的定義形式如下:

#include 

int close(int fd);

引數說明

fd:呼叫socket()函式時返回的套接字描述符。

除此之外,還可以呼叫shutdown()函式來關閉該套接字。該函式允許只停止在某個方向上的資料傳輸,而另乙個方向上的資料傳輸繼續進行,其定義形式如下:

#include 

int shutdown(int s,int how);

引數說明

s:是需要關閉的套接字的描述符;

how:允許為關閉操作選擇以下幾種方式。

0:不允許繼續接收資料;

1:不允許繼續傳送資料;

2:不允許繼續傳送和接收資料。

如果以上幾種行為都不允許,那麼可以直接呼叫close()函式。

套接字程式設計原理

注 本文內容為引用,可能部分內容表達時不夠準確,請參閱osi模型 文章有助於你正確理解其實際要表達意思!一 客戶機 伺服器模式 在tcp ip網路中兩個程序間的相互作用的主機模式是客戶機 伺服器模式 client server model 該模式的建立基於以下兩點 1 非對等作用 2 通訊完全是非同...

套接字程式設計原理 轉

一 客戶機 伺服器模式 在tcp ip網路中兩個程序間的相互作用的主機模式是客戶機 伺服器模式 client server model 該模式的建立基於以下兩點 1 非對等作用 2 通訊完全是非同步的。客戶機 伺服器模式在操作過程中採取的是主動請示方式 首先伺服器方要先啟動,並根據請示提供相應服務 ...

Winsocket程式設計之套接字原理

在tcp ip網路中兩個程序間的相互作用的主機模式是客戶機 伺服器模式.一 客戶機 伺服器模式在tcp ip網路中兩個程序間的相互作用的主機模式是客戶機 伺服器模式 client server model 該模式的建立基於以下兩點 1 非對等作用 2 通訊完全是非同步的。客戶機 伺服器模式在操作過程...