lab8-SOCKET編程原理【行業(yè)知識】

上傳人:8** 文檔編號:200089304 上傳時間:2023-04-14 格式:PPT 頁數(shù):52 大小:533KB
收藏 版權申訴 舉報 下載
lab8-SOCKET編程原理【行業(yè)知識】_第1頁
第1頁 / 共52頁
lab8-SOCKET編程原理【行業(yè)知識】_第2頁
第2頁 / 共52頁
lab8-SOCKET編程原理【行業(yè)知識】_第3頁
第3頁 / 共52頁

下載文檔到電腦,查找使用更方便

8 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《lab8-SOCKET編程原理【行業(yè)知識】》由會員分享,可在線閱讀,更多相關《lab8-SOCKET編程原理【行業(yè)知識】(52頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、SOCKET編程原理編程原理1向陽課件內容內容Socket簡介介uWindows SocketuLinux SocketSocket常用函數(shù)介常用函數(shù)介紹TCP/IP網(wǎng)網(wǎng)絡程序框架與程序框架與實例例通信方式通信方式u阻塞阻塞u非阻塞非阻塞2為什么需要為什么需要Socket普通的普通的I/O操作操作過程程u打開文件打開文件讀/寫操作關寫操作關閉文件文件TCP/IP協(xié)議被集成到操作系被集成到操作系統(tǒng)的內核中,引的內核中,引入了新型的入了新型的“I/O”操作操作u進行網(wǎng)行網(wǎng)絡操作的兩個操作的兩個進程在不同的機器上,如何程在不同的機器上,如何連接?接?u網(wǎng)網(wǎng)絡協(xié)議具有多具有多樣性,如何性,如何進行行統(tǒng)

2、一的操作一的操作?需要一種需要一種通用通用的網(wǎng)的網(wǎng)絡編程接口:程接口:Socketu獨立于具體獨立于具體協(xié)議uBSD Socket(伯克利套接字)是通(伯克利套接字)是通過標準的準的UNIX文件描述符和其它程序通文件描述符和其它程序通訊的一個方法,目前已的一個方法,目前已經(jīng)被廣泛移植到各個平臺。被廣泛移植到各個平臺。3Socket類型類型流式套接字流式套接字(SOCK_STREAM)u提供了一個面向提供了一個面向連接、可靠的數(shù)據(jù)接、可靠的數(shù)據(jù)傳輸服服務,數(shù)據(jù),數(shù)據(jù)無差無差錯、無重復的、無重復的發(fā)送且按送且按發(fā)送送順序接收。內序接收。內設置置流量控制,避免數(shù)據(jù)流淹沒慢的接收方。數(shù)據(jù)被看流量控制,

3、避免數(shù)據(jù)流淹沒慢的接收方。數(shù)據(jù)被看作是字作是字節(jié)流,無流,無長度限制。度限制。數(shù)據(jù)數(shù)據(jù)報套接字套接字(SOCK_DGRAM)u提供無提供無連接服接服務。數(shù)據(jù)包以獨立數(shù)據(jù)包的形式被。數(shù)據(jù)包以獨立數(shù)據(jù)包的形式被發(fā)送,不提供無差送,不提供無差錯保保證,數(shù)據(jù)可能,數(shù)據(jù)可能丟失或重復,失或重復,順序序發(fā)送,可能亂序接收。送,可能亂序接收。4Socket的位置的位置5兩類系統(tǒng)中使用的兩類系統(tǒng)中使用的Socket不同操作系不同操作系統(tǒng)中的中的SocketuWindows Socket(Winsock)uLinux Socket(BSD Socket)6Windows Socket簡稱稱Winsock,是在,

4、是在Windows環(huán)境下使用的境下使用的一套網(wǎng)一套網(wǎng)絡編程程規(guī)范,基于范,基于4.3BSD的的BSD Socket API制定制定u1991年年Winsock 1.1,16位,由位,由WINSOCK.DLL支支持,主要用在持,主要用在Windows 95中中u1997年年Winsock 2.2 版,版,32位,由位,由WSOCK32.DLL支持,主要用在支持,主要用在Windows 98及以及以后的版本中后的版本中u已已經(jīng)成成為Windows環(huán)境下網(wǎng)境下網(wǎng)絡編程的事程的事實標準準三三類函數(shù)函數(shù)u與與BSD Socket相兼容的基本函數(shù)相兼容的基本函數(shù)u與與BSD Socket相兼容的網(wǎng)相兼容的

5、網(wǎng)絡信息信息檢索函數(shù)索函數(shù)uWindows專用用擴展函數(shù)展函數(shù)7Linux Socket基本上就是基本上就是BSD Socket需要使用的需要使用的頭文件文件u數(shù)據(jù)數(shù)據(jù)類型:型:#include u函數(shù)定函數(shù)定義:#include 8TCP/IP網(wǎng)絡程序框架網(wǎng)絡程序框架面向面向連接的接的C/S程序工作流程程序工作流程無無連接的接的C/S程序工作流程程序工作流程9面向連接的面向連接的C/S程序工作流程程序工作流程(TCP)服服務器端工作流程器端工作流程u使用使用WSAStartup()函數(shù)函數(shù)檢查系系統(tǒng)協(xié)議棧安裝情況安裝情況u使用使用socket()函數(shù)函數(shù)創(chuàng)建服建服務器端通信套接口器端通信套接

6、口u使用使用bind()函數(shù)將函數(shù)將創(chuàng)建的套接口與服建的套接口與服務器地址器地址綁定定u使用使用listen()函數(shù)使服函數(shù)使服務器套接口做好接收器套接口做好接收連接接請求準求準備u使用使用accept()接收來自客接收來自客戶端由端由connect()函數(shù)函數(shù)發(fā)出的出的連接接請求求u根據(jù)根據(jù)連接接請求建立求建立連接后,使用接后,使用send()函數(shù)函數(shù)發(fā)送數(shù)送數(shù)據(jù),或者使用據(jù),或者使用recv()函數(shù)接收數(shù)據(jù)函數(shù)接收數(shù)據(jù)u使用使用closesocket()函數(shù)關函數(shù)關閉套接口(可以先用套接口(可以先用shutdown()函數(shù)先關函數(shù)先關閉讀寫通道)寫通道)u最后最后調用用WSACleanup

7、()函數(shù)函數(shù)結束束Winsock Sockets API10面向連接的面向連接的C/S程序工作流程程序工作流程(TCP)客客戶端程序工作流程端程序工作流程u使用使用WSAStartup()函數(shù)函數(shù)檢查系系統(tǒng)協(xié)議棧安裝情況安裝情況u使用使用socket()函數(shù)函數(shù)創(chuàng)建客建客戶端套接口端套接口u使用使用connect()函數(shù)函數(shù)發(fā)出也服出也服務器建立器建立連接的接的請求求(調用前可以不用用前可以不用bind()端口號,由系端口號,由系統(tǒng)自自動完成)完成)u連接建立后使用接建立后使用send()函數(shù)函數(shù)發(fā)送數(shù)據(jù),或使用送數(shù)據(jù),或使用recv()函數(shù)接收數(shù)據(jù)函數(shù)接收數(shù)據(jù)u使用使用closesocet(

8、)函數(shù)關函數(shù)關閉套接口套接口u最后最后調用用WSACleanup()函數(shù),函數(shù),結束束Winsock Sockets API11面向連接的面向連接的C/S程序工作流程程序工作流程(TCP)服務器與客戶端五元組的建立服務器與客戶端五元組的建立五元組五元組服務器服務器端五元端五元組組由由socket()確定確定由服務器端調用由服務器端調用bind()時確定時確定由由accept()確定確定客戶端客戶端五元組五元組由由socket()確定確定由客戶端的由客戶端的bind()調用確定。調用確定。如果客戶端沒有進行如果客戶端沒有進行bind()調調用,或調用了用,或調用了bind()但沒有指但沒有指定具

9、體地址或端口號,則由系定具體地址或端口號,則由系統(tǒng)內核自動確定地址和端口統(tǒng)內核自動確定地址和端口由由connect()確定確定12面向連接的面向連接的C/S程序工作流程圖程序工作流程圖(TCP)13無連接的無連接的C/S程序工作流程程序工作流程(UDP)無無連接的數(shù)據(jù)接的數(shù)據(jù)報傳輸服服務通信通信時,客,客戶端與服端與服務器端所使用的函數(shù)是器端所使用的函數(shù)是類似的,其工作流程如下:似的,其工作流程如下:u使用使用WSAStartup()函數(shù)函數(shù)檢查系系統(tǒng)協(xié)議棧的安裝情況的安裝情況u使用使用socket()函數(shù)函數(shù)創(chuàng)建套接口,以確定建套接口,以確定協(xié)議類型型u調用用bind()函數(shù)將函數(shù)將創(chuàng)建的套

10、接口與本地地址建的套接口與本地地址綁定,確定,確定本地地址和本地端口號定本地地址和本地端口號u使用使用sendto()函數(shù)函數(shù)發(fā)送數(shù)據(jù),或者使用送數(shù)據(jù),或者使用recvfrom()函函數(shù)接收數(shù)據(jù)數(shù)接收數(shù)據(jù)u使用使用closesocket()函數(shù)關函數(shù)關閉套接口套接口u調用用WSACleanup()函數(shù),函數(shù),結束束Windows Sockets API14無連接的無連接的C/S程序工作流程程序工作流程(UDP)注意事注意事項:u通信的一方可以不用通信的一方可以不用bind()綁定地址和端口,由系定地址和端口,由系統(tǒng)分配分配u不不綁定定IP地址和端口號的一方必地址和端口號的一方必須首先向首先向綁

11、定地址的一方定地址的一方發(fā)送數(shù)據(jù)送數(shù)據(jù)u無無連接的接的應用程序也可以用程序也可以調用用connect()函數(shù),但是它并不函數(shù),但是它并不向向對方方發(fā)出建立出建立連接的接的請求,而是在本地返回,由內核將求,而是在本地返回,由內核將connect()中指定的目中指定的目標IP地址和端口號地址和端口號記錄下來,在以后的通信中下來,在以后的通信中就可以使用面向就可以使用面向連接的數(shù)據(jù)接的數(shù)據(jù)發(fā)送函數(shù)送函數(shù)send()和數(shù)據(jù)接收函數(shù)和數(shù)據(jù)接收函數(shù)recv()u無無連接的數(shù)據(jù)接的數(shù)據(jù)報傳輸過程中,作程中,作為服服務器的一方必器的一方必須先啟先啟動u無無連接客接客戶端一般不端一般不調用用connect(),

12、在數(shù)據(jù),在數(shù)據(jù)發(fā)送前客送前客戶與與服服務器各自通器各自通過socket()和和bind()建立了半相關,建立了半相關,發(fā)送數(shù)據(jù)送數(shù)據(jù)時除指定本地套接口的地址外,除指定本地套接口的地址外,還需要指定接收方套接口地需要指定接收方套接口地址,從而在數(shù)據(jù)收址,從而在數(shù)據(jù)收發(fā)過程中程中動態(tài)建立全建立全連接接15無連接的無連接的C/S程序工作流程圖程序工作流程圖(UDP)16阻塞通信與非阻塞通信阻塞通信與非阻塞通信阻塞方式:套接字阻塞方式:套接字進行行I/O操作操作時,函數(shù)要等,函數(shù)要等待到相關的操作完成以后才能返回,待到相關的操作完成以后才能返回,對提高提高處理機的利用率不利,但理機的利用率不利,但編程

13、程簡單。非阻塞方式:套接字非阻塞方式:套接字進行行I/O操作操作時,無,無論操操作成功與否,作成功與否,調用都會立即返回。用都會立即返回。阻塞方式阻塞方式編程程簡單,一個套接口的默,一個套接口的默認操作模操作模式式為阻塞,可以阻塞,可以調用函數(shù)用函數(shù)ioctlsocket()進行行設置。置。17并發(fā)服務器并發(fā)服務器18Socket常用函數(shù)介紹常用函數(shù)介紹基本函數(shù)基本函數(shù)網(wǎng)網(wǎng)絡信息信息檢索函數(shù)索函數(shù)19基本函數(shù)基本函數(shù)網(wǎng)網(wǎng)絡連接函數(shù)接函數(shù)usocket創(chuàng)建套接字建套接字ubind綁定本機端口定本機端口uconnect建立建立連接接ulisten監(jiān)聽端口聽端口uaccept接受接受連接接urecv

14、,recvfrom數(shù)據(jù)接收數(shù)據(jù)接收usend,sendto數(shù)據(jù)數(shù)據(jù)發(fā)送送uclose,shutdown關關閉套接字套接字20基本函數(shù)基本函數(shù)轉換函數(shù)函數(shù)uIP地址地址轉換函數(shù)函數(shù)linet_addr()點分十點分十進制數(shù)表示的制數(shù)表示的IP地址地址轉換為網(wǎng)網(wǎng)絡字字節(jié)序的序的IP地址地址linet_ntoa()網(wǎng)網(wǎng)絡字字節(jié)序的序的IP地址地址轉換為點分十點分十進制數(shù)制數(shù)表示的表示的IP地址地址u字字節(jié)排序函數(shù)排序函數(shù)lhtonl4字字節(jié)主機字主機字節(jié)序序轉換為網(wǎng)網(wǎng)絡字字節(jié)序序lntohl 4字字節(jié)網(wǎng)網(wǎng)絡字字節(jié)序序轉換為主機字主機字節(jié)序序lhtons2字字節(jié)主機字主機字節(jié)序序轉換為網(wǎng)網(wǎng)絡字字節(jié)序序

15、lntohs2字字節(jié)網(wǎng)網(wǎng)絡字字節(jié)序序轉換為主機字主機字節(jié)序序21網(wǎng)絡信息檢索函數(shù)網(wǎng)絡信息檢索函數(shù)網(wǎng)網(wǎng)絡信息信息檢索函數(shù)索函數(shù)ugethostname獲得主機名得主機名ugetpeername獲得與套接口相得與套接口相連的的遠程程協(xié)議地址地址ugetsockname獲得套接口本地得套接口本地協(xié)議地址地址ugethostbyname根據(jù)主機名取得主機信息根據(jù)主機名取得主機信息ugethostbyaddr根據(jù)主機地址取得主機信息根據(jù)主機地址取得主機信息ugetprotobyname根據(jù)根據(jù)協(xié)議名取得主機名取得主機協(xié)議信息信息ugetprotobynumber根據(jù)根據(jù)協(xié)議號取得主機號取得主機協(xié)議信息信

16、息ugetservbyname根據(jù)服根據(jù)服務名取得相關服名取得相關服務信息信息ugetservbyport根據(jù)端口號取得相關服根據(jù)端口號取得相關服務信息信息ugetsockopt/setsockopt獲取取/設置一個套接口置一個套接口選項 uioctlsocket設置套接口的工作方式置套接口的工作方式22Windows中的中的Socket編程編程Windows中的中的Socket編程程uWinsock 的啟的啟動uWinsock API基本函數(shù)基本函數(shù)uTCP/IP網(wǎng)網(wǎng)絡程序框架程序框架(C/S模式模式)u阻塞與非阻塞通信方式阻塞與非阻塞通信方式u實例程序例程序說明明23WinsockWins

17、ock是一個基于是一個基于Socket模型的模型的API,在,在Windows系系統(tǒng)中廣泛使用中廣泛使用需要包含需要包含頭文件文件Winsock2.h,需要使用,需要使用庫ws2_32.lib,包含,包含辦法可以用法可以用語句來告句來告訴編譯時調用用該庫#pragma comment(lib,”ws2_32.lib”);如果使用如果使用Visual C+6.0,可以通,可以通過“工程工程”“設置置”“工程工程設置置”“鏈接接”“對象象/庫模模塊”中加入中加入“ws2_32.lib”24Windows Socket的啟動的啟動使用使用Winsock API編制的網(wǎng)制的網(wǎng)絡應用程序中,在用程序中,

18、在調用任用任何一個何一個Winsock函數(shù)之前都必函數(shù)之前都必須檢查協(xié)議棧安裝情況,安裝情況,使用函數(shù)使用函數(shù)WSAStartup()完成操作。完成操作。int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);wVersionRequested是一個是一個WORD型型(雙字雙字節(jié)型型)數(shù)數(shù)值,指定使用的版本號,指定使用的版本號,對Winsock2.2而言,此而言,此參數(shù)的參數(shù)的值為0 x0202,也可以用宏,也可以用宏MAKEWORD(2,2)來來獲得得lpWSAData是一個指向是一個指向WSADATA結構的指構的指針,它,它返回

19、關于返回關于Winsock實現(xiàn)的的詳細信息信息25Winsock啟動示例啟動示例#include WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)/Winsock初始化初始化錯誤return;if(wsaData.wVersion!=wVersionRequested)/Winsock版本不匹配版本不匹配WSACleanup();return;/說明明WinsockDLL正確加正確加載,可以,可以執(zhí)行以下代行以下

20、代碼26創(chuàng)建套接口創(chuàng)建套接口socket()應用程序在使用套接口通信前,必用程序在使用套接口通信前,必須要要擁有一個套接口,使有一個套接口,使用用socket()函數(shù)來函數(shù)來給應用程序用程序創(chuàng)建一個套接口。建一個套接口。SOCKET socket(int af,int type,int protocol);27socket()參數(shù)說明參數(shù)說明af參數(shù)說明套接字接口要使用的協(xié)議地址族,地址族與協(xié)議族含義相同。如果想?yún)?shù)說明套接字接口要使用的協(xié)議地址族,地址族與協(xié)議族含義相同。如果想建立一個建立一個TCP或或UDP,只能用常量,只能用常量AF_INET表示使用互聯(lián)網(wǎng)協(xié)議表示使用互聯(lián)網(wǎng)協(xié)議(IP)地

21、址。地址。Winsock還支持其他協(xié)議,但一般很少使用。還支持其他協(xié)議,但一般很少使用。type參數(shù)描述套接口的類型,參數(shù)描述套接口的類型,af是是AF_INET的時候只能為的時候只能為SOCK_STREAM、SOCK_DGRAM或或SOCK_RAWprotocol說明該套接口使用的特定協(xié)議,當協(xié)議地址族說明該套接口使用的特定協(xié)議,當協(xié)議地址族af和協(xié)議類型和協(xié)議類型type確定后,確定后,協(xié)議字段可以使用的值是限定的協(xié)議字段可以使用的值是限定的 協(xié)議協(xié)議地址族地址族套接口類型套接口類型套接口類型使用套接口類型使用的值的值協(xié)議字段協(xié)議字段互聯(lián)互聯(lián)網(wǎng)協(xié)網(wǎng)協(xié)議議(IP)AF_INETTCPSOCK

22、_STREAMIPPROTO_TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAWIPPROTO_ICMP28指定本地地址指定本地地址bind()當當socket()創(chuàng)建了一個套接口后,需要將建了一個套接口后,需要將該套接口與套接口與該主機主機上提供服上提供服務的某端口的某端口聯(lián)系在一起,系在一起,bind()函數(shù)用于完成函數(shù)用于完成這樣的的綁定。定。int bind(SOCKET s,const struct sockaddr FAR*name,int namelen);29bind()參數(shù)說明參數(shù)說明s標識一個未一個未綁定的套接口描述字,它是定

23、的套接口描述字,它是socket()函數(shù)函數(shù)調用用成功成功時返回的返回的值name是一個與指定是一個與指定協(xié)議有關的地址有關的地址結構指構指針,存,存儲了套接了套接口的地址信息,口的地址信息,Winsock中使用中使用sockaddr_in結構指定構指定IP地地址和端口信息址和端口信息struct sockaddr_inshort sin_family;u_short sin_port;struct in_addrsin_addr;charsin_zero8;sin_family一般一般為AF_INET,表示使用,表示使用IP地址族;地址族;sin_port是以網(wǎng)是以網(wǎng)絡字字節(jié)序表序表示的示的

24、16位端口號;位端口號;sin_addr是網(wǎng)是網(wǎng)絡字字節(jié)序的序的32位位IP地址;地址;sin_zero字段一般不字段一般不用,用用,用0填充填充namelen表示地址參數(shù)表示地址參數(shù)(name)的的長度度IP地址參數(shù)地址參數(shù)為INADDR_ANY,則由系由系統(tǒng)內核來自內核來自動指定指定port為0,則由系由系統(tǒng)自自動指派一個指派一個10245000之之間惟一的端惟一的端口號口號30bind()實例實例#include SOCKET s;sockaddr_in tcpaddr;int iSockErr;int port=5000;/端口號端口號s=socket(AF_INET,SOCK_STR

25、EAM,IPPROTO_TCP);tcpaddr.sin_family=AF_INET;tcpaddr.sin_port=htons(port);tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(s,(LPSOCKADDR)&tcpaddr,sizeof(tcpaddr)=SOCKET_ERROR)iSockErr=WSAGetLastError();/根據(jù)不同的根據(jù)不同的錯誤類型型進行不同的行不同的處理理return;函數(shù)函數(shù)調用成功,用成功,進行其他行其他處理。理。31服務器端啟動監(jiān)聽服務器端啟動監(jiān)聽listen()函數(shù)函數(shù)在一個服在一個服

26、務器端用器端用socket()調用成功用成功創(chuàng)建了一個套接建了一個套接口,并用口,并用bind()函數(shù)和一個指定的地址關函數(shù)和一個指定的地址關聯(lián)后,就需后,就需要指示要指示該套接口套接口進入入監(jiān)聽聽連接接請求狀求狀態(tài),這需要通需要通過listen()函數(shù)來函數(shù)來實現(xiàn)int listen(SOCKET s,int backlog);s代表一個已代表一個已綁定了地址,但定了地址,但還未建立未建立連接的套接口接的套接口描述字描述字backlog指定了正在等待指定了正在等待連接的最大接的最大隊列列長度度32客戶端請求連接客戶端請求連接connect()函數(shù)函數(shù)當服當服務器端建立好套接口并與一個本地地址

27、器端建立好套接口并與一個本地地址綁定后,定后,就就進入入監(jiān)聽狀聽狀態(tài),等待客,等待客戶發(fā)出出連接接請求。在客求。在客戶端套接口建立好之后,就端套接口建立好之后,就調用用connect()函數(shù)來與服函數(shù)來與服務器建立器建立連接。接。int connect(SOCKET s,const struct sockaddr FAR*name,int namelen);33connect()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s將要建立將要建立連接的套接口描述字接的套接口描述字name是一個指向是一個指向遠端套接口地址端套接口地址結構構(sockaddr_in)的指的指針,表示,表示s套接口欲與其建套接口欲與其建立一

28、條立一條連接接namelen是服是服務器端的地址器端的地址長度,即度,即name的的長度度34Connect()函數(shù)的說明函數(shù)的說明在客在客戶端使用端使用該函數(shù)函數(shù)請求建立求建立連接接時,將激活建立,將激活建立連接的三次握手,用來建立一條到服接的三次握手,用來建立一條到服務器器TCP的的連接。接。如果如果調用用該函數(shù)前沒有函數(shù)前沒有調用用bind()來來綁定本地地址,定本地地址,則由系由系統(tǒng)隱式式綁定一個地址到定一個地址到該套接口套接口該函數(shù)用在函數(shù)用在UDP的客的客戶端端時,connect()函數(shù)并不是函數(shù)并不是真正地真正地發(fā)出建立出建立請求求連接的接的請求,求,調用將從本地操作用將從本地操

29、作系系統(tǒng)直接返回。直接返回。這樣可以將服可以將服務器的地址信息保存下器的地址信息保存下來,在后來,在后續(xù)UDP端口端口發(fā)送數(shù)據(jù)送數(shù)據(jù)時,由套接口自,由套接口自動在在發(fā)送函數(shù)中填入服送函數(shù)中填入服務器地址,而不需要由器地址,而不需要由應用程序在用程序在調用用發(fā)送函數(shù)送函數(shù)時填入填入35服務器端接受連接服務器端接受連接accept()函數(shù)函數(shù)在服在服務器端通器端通過listen()函數(shù)函數(shù)調用表示服用表示服務器器進入入監(jiān)聽客聽客戶的的連接接請求狀求狀態(tài),而在服,而在服務器端器端調用用accept()函數(shù)函數(shù)時表示可以接收來自客表示可以接收來自客戶端端由由connect()發(fā)出的出的連接接請求,雙方

30、求,雙方進入入連接接狀狀態(tài)。SOCKET accept(SOCKET s,struct sockaddr FAR*addr,int FAR*addrlen);36accept()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s標識一個套接字,一個套接字,該套接口套接口處于于監(jiān)聽狀聽狀態(tài)addr是一個地址是一個地址結構的指構的指針,用來存放,用來存放發(fā)出出連接接請求的那個求的那個客客戶機的機的IP地址信息地址信息addrlen指出客指出客戶套接口地址套接口地址結構的構的長度度函數(shù)函數(shù)說明明:該函數(shù)用于面向函數(shù)用于面向連接的服接的服務器端,器端,在在IP協(xié)議族中,只用于族中,只用于TCP服服務器端器端37發(fā)送數(shù)據(jù)發(fā)送數(shù)

31、據(jù)-send()函數(shù)函數(shù)在已在已經(jīng)建立建立連接的套接口上接的套接口上發(fā)送數(shù)據(jù),可以使送數(shù)據(jù),可以使用用send()函數(shù)函數(shù)int send(SOCKET s,const char FAR*buf,int len,int flags);38send()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s用于用于標識已建立已建立連接的套接字接的套接字buf是一個字符是一個字符緩沖區(qū),內有將要沖區(qū),內有將要發(fā)送的數(shù)據(jù)送的數(shù)據(jù)len即將即將發(fā)送的送的緩沖區(qū)中的字符數(shù)沖區(qū)中的字符數(shù)flags用于控制數(shù)據(jù)用于控制數(shù)據(jù)傳輸方式,方式,0表示按正常方式表示按正常方式發(fā)送送數(shù)據(jù);宏數(shù)據(jù);宏MSG_DONTROUTE說明系明系統(tǒng)目目標主機

32、就在主機就在直接直接連接的本地網(wǎng)接的本地網(wǎng)絡中,無需路由中,無需路由選擇;MSG_OOB指出數(shù)據(jù)是按指出數(shù)據(jù)是按帶外數(shù)據(jù)外數(shù)據(jù)發(fā)送的送的函數(shù)函數(shù)說明明:send()函數(shù)適用于已建立函數(shù)適用于已建立連接的數(shù)據(jù)接的數(shù)據(jù)報或或流式套接口流式套接口發(fā)送數(shù)據(jù),送數(shù)據(jù),對于數(shù)據(jù)于數(shù)據(jù)報類型套接口必型套接口必須注注意意發(fā)送數(shù)據(jù)送數(shù)據(jù)長度不大于通信子網(wǎng)的度不大于通信子網(wǎng)的IP包最大包最大長度度39接收數(shù)據(jù)接收數(shù)據(jù)recv()函數(shù)函數(shù)對于已建立于已建立連接的套接口來接的套接口來說,要從套接口上,要從套接口上接收數(shù)據(jù),就要使用接收數(shù)據(jù),就要使用recv()函數(shù)。函數(shù)。int recv(SOCKET s,char

33、FAR*buf,int len,int flags);40recv()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s為已建立已建立連接的套接口接的套接口buf為用于接收數(shù)據(jù)的用于接收數(shù)據(jù)的緩沖區(qū)沖區(qū)len為緩沖區(qū)的沖區(qū)的長度度flags指定指定調用的方式。用的方式。0表示接收的是正常數(shù)表示接收的是正常數(shù)據(jù),無特殊行據(jù),無特殊行為。MSG_PEEK表示會使有用表示會使有用的數(shù)據(jù)復制到所提供的接收端的數(shù)據(jù)復制到所提供的接收端緩沖區(qū)內,但是沖區(qū)內,但是沒有從系沒有從系統(tǒng)緩沖區(qū)中將數(shù)據(jù)沖區(qū)中將數(shù)據(jù)刪除。除。MSG_OOB表示表示處理理帶外數(shù)據(jù)。外數(shù)據(jù)。41無連接的套接口上接收數(shù)據(jù)無連接的套接口上接收數(shù)據(jù)-recvfrom

34、()對于無于無連接的套接口來接的套接口來說,要從套接口上接收一個數(shù),要從套接口上接收一個數(shù)據(jù)據(jù)報并保存并保存發(fā)送數(shù)據(jù)的源地址,就要使用送數(shù)據(jù)的源地址,就要使用recvfrom()函數(shù)。函數(shù)。int recvfrom(SOCKET s,char FAR*buf,int len,int flags,struct sockaddr FAR*from,int FAR*fromlen);42recvfrom()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s標識一個套接口的描述字一個套接口的描述字buf接收數(shù)據(jù)的接收數(shù)據(jù)的緩沖區(qū)沖區(qū)len接收數(shù)據(jù)接收數(shù)據(jù)緩沖區(qū)的沖區(qū)的長度度flags調用操作方式,同用操作方式,同recv()

35、中的中的flagsfrom可可選指指針,指向裝有源地址的,指向裝有源地址的緩沖區(qū)沖區(qū)fromlen可可選指指針,指向,指向from緩沖區(qū)的沖區(qū)的長度度值函數(shù)函數(shù)說明明:該函數(shù)的用法與有函數(shù)的用法與有連接接時recv()的的用法一致,要注意的是用法一致,要注意的是該函數(shù)也可以用于有函數(shù)也可以用于有連接接時數(shù)據(jù)的接收數(shù)據(jù)的接收43在無連接套接口上發(fā)送數(shù)據(jù)在無連接套接口上發(fā)送數(shù)據(jù)-sendto()對于無于無連接的套接口來接的套接口來說,要從套接口上,要從套接口上發(fā)送送一個數(shù)據(jù)一個數(shù)據(jù)報,就要使用,就要使用sendto()函數(shù)函數(shù)int sendto(SOCKET s,const char FAR*b

36、uf,int len,int flags,const struct sockaddr FAR*to,int tolen);44sendto()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s本機的套接字本機的套接字buf待待發(fā)送數(shù)據(jù)的送數(shù)據(jù)的緩沖區(qū)沖區(qū)len指明指明buf緩沖區(qū)中要沖區(qū)中要發(fā)送的數(shù)據(jù)送的數(shù)據(jù)長度度flags調用方式用方式標志位,同志位,同send()中的中的flagsto可可選指指針,指向接收數(shù)據(jù)的目的套接口地址,指向接收數(shù)據(jù)的目的套接口地址tolen是是to所指的地址的所指的地址的長度度函數(shù)函數(shù)說明明:該函數(shù)的使用方法函數(shù)的使用方法類似似send()函數(shù),當用函數(shù),當用于無于無連接套接字接口,接套

37、接字接口,調用函數(shù)前要用函數(shù)前要設置,指出目置,指出目標IP地址和目地址和目標端口號。如果用于有端口號。如果用于有連接的套接口接的套接口時,則不能指定目不能指定目標地址和目地址和目標端口,將端口,將to設置置為空,地空,地址址長度度設為0。當然在有。當然在有連接的情況下很少使用接的情況下很少使用該函函數(shù)數(shù)45關閉讀寫通道關閉讀寫通道-shutdown()函數(shù)函數(shù)在一個套接口上的在一個套接口上的讀寫操作完成后,寫操作完成后,應該首先首先使用使用shutdown()函數(shù)來關函數(shù)來關閉套接口的套接口的讀通道、通道、寫通道或寫通道或讀寫通道,寫通道,這樣做的好做的好處是當雙方不是當雙方不再有數(shù)據(jù)要再有

38、數(shù)據(jù)要發(fā)送或接收送或接收時,可以通知,可以通知對方,以方,以防止數(shù)據(jù)防止數(shù)據(jù)丟失,并能失,并能“優(yōu)雅雅”地關地關閉連接接int shutdown(SOCKET s,int how);46shutdown()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s標識一個套接口的描述字標識一個套接口的描述字how是一個標志,用于描述禁止哪些操作,取值如下表所示是一個標志,用于描述禁止哪些操作,取值如下表所示關閉方式關閉方式參數(shù)值參數(shù)值說明說明SD_RECEIVE0表示不允許再調用接收函數(shù),它關閉讀通道。套接口表示不允許再調用接收函數(shù),它關閉讀通道。套接口接收緩沖區(qū)中的所有數(shù)據(jù)都被丟棄,并且有新數(shù)據(jù)到接收緩沖區(qū)中的所有數(shù)據(jù)都被

39、丟棄,并且有新數(shù)據(jù)到達套接口時,也被達套接口時,也被TCP協(xié)議層丟棄,但它對發(fā)送緩沖協(xié)議層丟棄,但它對發(fā)送緩沖區(qū)沒有影響,進程仍然可以在套接口上發(fā)送數(shù)據(jù)區(qū)沒有影響,進程仍然可以在套接口上發(fā)送數(shù)據(jù)SD_SEND1表示不允許再調用發(fā)送函數(shù),它關閉寫通道。在套接表示不允許再調用發(fā)送函數(shù),它關閉寫通道。在套接口發(fā)送緩沖區(qū)中的數(shù)據(jù)都被發(fā)送出去,得到接收端確口發(fā)送緩沖區(qū)中的數(shù)據(jù)都被發(fā)送出去,得到接收端確認之后,就生成一個認之后,就生成一個FIN包關閉連接。但它對接收緩包關閉連接。但它對接收緩沖區(qū)沒有影響,進程仍然可以在套接口上接收數(shù)據(jù)沖區(qū)沒有影響,進程仍然可以在套接口上接收數(shù)據(jù)SD_BOTH2關閉讀寫通道

40、,相當于執(zhí)行了上面關閉讀寫通道,相當于執(zhí)行了上面SD_RECEIVE和和SD_SEND兩個命令兩個命令47關閉套接口關閉套接口-closesocket()函數(shù)函數(shù)shutdown函數(shù)只關函數(shù)只關閉讀寫通道,并不關寫通道,并不關閉套套接口,且套接口所占有的接口,且套接口所占有的資源將被一直保留到源將被一直保留到closesocket()調用之前。用之前。一個套接口不再使用一個套接口不再使用時一定要關一定要關閉這個套接口,個套接口,以以釋放與放與該套接口關套接口關聯(lián)的所有的所有資源,包括等候源,包括等候處理的數(shù)據(jù)。理的數(shù)據(jù)。int closesocket(SOCKET s);參數(shù)參數(shù)s表示即將被關

41、表示即將被關閉的套接口的套接口48IP地址轉換函數(shù)地址轉換函數(shù)char*inet_ntoa(struct in_addr in)in為傳入?yún)?shù),表示一個入?yún)?shù),表示一個結構型的構型的IP主機地址,主機地址,該函數(shù)將一個函數(shù)將一個32位數(shù)字表示的位數(shù)字表示的IP地址地址轉換成點成點分十分十進制制IP地址字符串地址字符串unsigned long inet_addr(const char FAR*cp)該函數(shù)將一個點分十函數(shù)將一個點分十進制制IP地址字符串地址字符串轉換成成32位數(shù)字表示的位數(shù)字表示的IP地址。地址。兩函數(shù)互兩函數(shù)互為反函數(shù)反函數(shù)49字節(jié)序轉換函數(shù)字節(jié)序轉換函數(shù)u_long hto

42、nl(u_long hostlong)u4字字節(jié)主機字主機字節(jié)序表示的整數(shù)序表示的整數(shù)轉換為4字字節(jié)相相應的網(wǎng)的網(wǎng)絡字字節(jié)序表示的整數(shù)序表示的整數(shù)u_short htons(u_short hostshort)u2字字節(jié)主機字主機字節(jié)序表示的整數(shù)序表示的整數(shù)轉換為2字字節(jié)相相應的網(wǎng)的網(wǎng)絡字字節(jié)序表示的整數(shù)序表示的整數(shù)u_long ntohl(u_long netlong)u4字字節(jié)網(wǎng)網(wǎng)絡字字節(jié)序表示的整數(shù)序表示的整數(shù)轉換為4字字節(jié)相相應的主的主機字機字節(jié)序表示的整數(shù)序表示的整數(shù)u_short ntohs(u_short netshort)u2字字節(jié)網(wǎng)網(wǎng)絡字字節(jié)序表示的整數(shù)序表示的整數(shù)轉換為2字

43、字節(jié)相相應的主的主機字機字節(jié)序表示的整數(shù)序表示的整數(shù)50終止使用終止使用Winsock-WSACleanup()函數(shù)函數(shù)當當應用程序不再使用用程序不再使用Winsock API中的任何函中的任何函數(shù)數(shù)時,必,必須調用用WSACleanup()將其從將其從Windows Socket的的實現(xiàn)中注中注銷,以,以釋放放為此此應用程序或用程序或DLL分配的任何分配的任何資源。源。int WSACleanup(void);函數(shù)函數(shù)說明:明:WSACleanup()函數(shù)是任何一個函數(shù)是任何一個Winsock應用程序在最后必用程序在最后必須要要調用的函數(shù)。用的函數(shù)。在一個多在一個多線程的程的環(huán)境下,境下,W

44、SACleanup()函數(shù)函數(shù)中止了中止了Windows Sockets在所有在所有線程上的操程上的操作作51高級網(wǎng)絡編程高級網(wǎng)絡編程APIMFC編程技程技術定定義了用于網(wǎng)了用于網(wǎng)絡編程的程的Winsock類,類名名為CAsyncSocket;還定定義了一個派生于了一個派生于CAsyncSocket的的CSocket類。這兩個兩個類簡單實用,用用,用戶可以使用它可以使用它們來來實現(xiàn)自己的網(wǎng)自己的網(wǎng)絡程序。程序。與前面的介與前面的介紹相似,使用相似,使用MFC的的Winsock類進行操作行操作時需要使用需要使用Winsock2.h、Winsock32.dll和和ws2_32.lib三個文件三個文件52

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲