《c语言从入门到精通》看书笔记——第16章 网络套接字编程(下)——套接字
生活随笔
收集整理的這篇文章主要介紹了
《c语言从入门到精通》看书笔记——第16章 网络套接字编程(下)——套接字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、套接字概述
套接字是網絡通信的基石,是網絡通信的基本構件。
所謂套接字,實際上是一個指向傳輸提供者的句柄。在WinSock中,就是通過操作該句柄來實現網絡通信和管理的。根據性質和作用不同,套接字可以分為原始套接字、流式套接字、數據包套接字3種。
(1)原始套接字:原始套接字是在WinSock2規范中提出的,他能夠使程序開發人員對底層的網絡傳輸機制進行控制,在原始套接字下接受的數據中包含IP頭
(2)流式套接字:流式套接字提供雙向、有序、可靠的數據傳輸服務,該類型套接字在通信前需要雙方建立連接。TCP協議采用的就是流式套接字。
(3)數據包套接字:數據報套接字提供雙向的數據流,但是它不能保證數據傳輸的可靠性、有序性、和無重復性。UDP協議采用就是數據包套接字。
2、TCP套接字的socket編程
TCP是面向連接的、可靠的傳輸協議。通信雙方建立連接就可以利用TCP進行通信。TCP提供了數據確認和數據重傳的機制,保證了發送的數據一定能到達通信的對方。
基于TCP面向連接的socket編程的服務器端程序流程如下:
(1)創建套接字socket。
(2)將創建的套接字綁定(bind)到本地的地址和端口上
(3)設置套接字的狀態為監聽狀態(listen),準備接受客戶端的連接請求。
(4)接受請求(accpet),同時返回得到一個用于連接的新套接字。
(5)使用這個新套接字進行通信(通信函數使用send/recv)。
(6)通信完畢,釋放套接字資源(closesocket)。
基于TCP面向連接的socket編程的客戶端程序流程如下:
(1)創建套接字socket。
(2)向服務器發送連接請求(connect)
(3)請求連接后與服務器進行通信操作(send/recv)
(4)釋放套接字資源(closesocket)
3、UDP的套接字的socket編程
UDP是無連接的、不可靠的傳輸協議。采用UDP進行通信時,不需要建立連接,可以直接向一個IP地址發送數據,但是不能保證對方能收到??梢园逊掌鞣Q為接收端,客服端就是發送數據的發送端。
基于UDP面向無連接的socket編程的發送端程序流程如下:
(1)創建套接字socket
(2)將套接字綁定(bind)帶一個本地地址和端口上
(3)等待接收數據(recvfrom)
(4)釋放套接字資源(closesocket)
基于UDP面向無連接的socket編程的接收端程序流程如下:
(1)創建套接字socket
(2)向服務器發送數據(sendto)
(3)釋放套接字資源(closesocket)
4、套接字函數介紹
(1)WSAStartup函數:初始化套接字庫。其原型如下:
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
注意:WSAStartup函數用于初始化Ws2_32.dll動態鏈接庫。在使用套接字函數之前,一定要初始化Ws2_32.dll動態鏈接庫。
說明:1)wVersionRequested:表示調用者使用的Windows socket的版本,該字節記錄修訂版本,低字節記錄主版本。例如版本2.1,則高字節記錄1,低字節記錄2
2)lpWSAData:是一個WSADATA結構指針,該結構詳細記錄了Windows套接字的相關信息。其定義如下:
typedef struct WSAData
{
WORD ? ? wVersion;
WORD ? ? wHighVersion;
char ? ? szDwscription[WSADESCRIPTION_LEN+1];
char ? ? szSystemStatus[WSASYS_STAUS_LEN+1];
unsigned short ? ? iMaxSockets;
unsigned short ? ? iMaxUdpDg;
char FAR* ? ? lpVendorlnfo;
}WSADATA,FAR*LPWSADATA;
(2)socket函數:創建一個套接字
SOCKET socket(int af,int type,int protocol);
說明:1)af:表示一個地址家族,通常為AF_INET
2)type:表示套接字類型,如果未SOCK_STREAM,表示創建面向連接的流式套接字;為SOCK_DGRAM,表示創建面向無連接的數據報套接字;SOCK_RAW,表示創建原始套接字。對于這些值,用戶可以在Winsock2.h頭文件中找到
3)potocol:表示套接口所用的協議,若果用戶不指定,可以設置為0
4)返回值:創建的套接字句柄
(3)bind函數:將套接字綁定到指定的端口和地址上。
int bind(SOCKET s,const stuct sockaddr FAR* ? ? name,int namelen);
說明:
1)s:表示套接字標識
2)name:是一個sockaddr結構指針,該結構中包含了要結合的地址和端口號
3)namelen:確定name緩沖區的長度
4)返回值:如果函數執行成功,則返回值為0,否則為SOCKET_ERROR
(4)listen函數:將嵌套字設定為監聽模式。對于流式套接字,必須處于監聽模式才能夠接收客戶端套接字的連接。
int listen(SOCKET S,int backlog);
說明:
1)s:表示套接字標識
2)backlog:表示等待連接的最大隊列長度。
(5)accept函數:接受客戶端的連接。在流式套接字中,只有在套接字處于監聽狀態,才能接受客戶端的連接。
SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);
說明:
1)s:表示套接字標識
2)addr:是一個sockddr_in結構指針,包含一組客戶端的端口號、IP地址等信息。
3)addrlen:用于接收參數addr的長度
(6)closesocket函數:關閉套接字
int closesocket(SOCKET s);
(7)connect函數:發送連接請求
int connect(SOCKET s,const struct sockaddr FAR* ? ? name,int namelen);
說明:
1)s:表示套接字標識
2)name:表示套接字s要連接的主機地址和端口號
3)namelen:是neme緩沖區的長度
4)返回值:執行成功,返回值為0,否則放回SOCKET_ERROR.用戶可以通過WSAGETLASTERROR得到其錯誤描述
(8)htons函數:將一個16位的無符號短整型數據由主機排列方式轉換為網絡排列方式
u_short htons(u_short hostshort);
說明:
1)hostshort:是一個主機排列方式的無符號短整型數據
2)返回值:函數返回值是16位的網絡排列方式數據
(9)htonl函數:將一個無符號長整型數據由主機排列方式轉換為網絡排列方式
u_long htonl(u_long hostlong);
說明:
1)hostlong:表示一個主機排列方式的無符號長整型數據
2)返回值:32位的網絡排列方式數據
(10)inet_addr函數:將一個由字符串表示的地址轉換為32位的無符號長整型數據
unsigned long inet_addr(const char FAR* cp);
說明:
1)cp:表示一個IP復制的字符串
2)返回值:32位無符號整數
(11)recv函數:從面向連接的套接字中接收數據
int recv(SOCKET s,char FAR* BUF,int len,int,flags);
說明:
1)s:表示套接字標識
2)buf:接收數據的緩沖區
3)len:buf的長度
4)flags:函數的調用方式。如果未MSG_PEEK,則表示查看傳來的數據,在序列前端的數據會被復制一份到緩沖區中,但是這個數據不會從序列中移走;如果是MSG_OOB,則表示用來處理Out-Of-Band數據,也就是外帶數據。
(12)send函數:在面向連接方式的套接字間發送數據。
? int send(SOCKET s,const char FAR* buf,int len,int flags);
說明:
1)s:表示套接字標識
2)buf:表示存放要發送數據的緩沖區
3)len:緩沖區長度
4)flags:函數的調用方式
(13)recvfrom函數:接收一個數據報信息并保存源地址
int recvfrom(SOCKET s,char FAR* buf,int len,int flags, struct sockaddr FAR* from,int FAR* fromlen);
說明:
1)s:表示套接字標識
2)buf:指向緩沖區的指針,用來接收數據
3)len:緩沖區的長度
4)flags:通過設置這個值可以影響函數調用的行為
5)from:是一個指向地址結構的指針,用來接收發送數據防的地址信息
6)fromlen:表示緩沖區的長度
(14)sendto函數:向一個特定的目的方發送數據
int sendto(SOCKET s,const char FAR* buf,int len,int flags,const struct sockaddr FAR* to,int tolen);
說明:
1)s:表示一個(可能已經建立連接的)套接字標識
2)buf:指向緩沖區的指針,該緩沖區包含將要發送的數據
3)len:表示緩沖區的長度
4)flags:通過設置這個值可以影響函數的調用行為
5)to:指定目標調節子的地址
6)tolen:表示緩沖區的長度
(15)WSACleanup函數:釋放為Ws2_32.dll動態鏈接庫初始化時分配的資源
int WSACleanup(void);
使用該函數關閉動態鏈接庫:
WSACleanup();
總結
以上是生活随笔為你收集整理的《c语言从入门到精通》看书笔记——第16章 网络套接字编程(下)——套接字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring+websocket综合(s
- 下一篇: 《FPGA入门教程》看书随笔——数字电路