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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/19 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《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章 网络套接字编程(下)——套接字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。