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