日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《c语言从入门到精通》看书笔记——第16章 网络套接字编程(下)——套接字

發(fā)布時(shí)間:2023/12/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。