套接字:英文為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 通訊完全是非同步的。客戶機 伺服器模式在操作過程...