TCP-IP協(xié)議與網(wǎng)絡編程-任泰明-TCP網(wǎng)絡程序框架與實例_第1頁
TCP-IP協(xié)議與網(wǎng)絡編程-任泰明-TCP網(wǎng)絡程序框架與實例_第2頁
TCP-IP協(xié)議與網(wǎng)絡編程-任泰明-TCP網(wǎng)絡程序框架與實例_第3頁
TCP-IP協(xié)議與網(wǎng)絡編程-任泰明-TCP網(wǎng)絡程序框架與實例_第4頁
TCP-IP協(xié)議與網(wǎng)絡編程-任泰明-TCP網(wǎng)絡程序框架與實例_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第7章 TCP/IP網(wǎng)絡程序框架與實例7.1 網(wǎng)絡應用程序的基本工作流程7.2 基于TCP的客戶/服務器通信程序?qū)嵗?.3 基于UDP的客戶與服務器通信程序?qū)嵗曨} 17.1 網(wǎng)絡應用程序的基本工作流程7.1.1 面向連接的客戶/服務器程序工作流程1服務器端程序工作流程工作時,在服務器端的應用程序應該首先啟動,以等待客戶的服務請求。其工作流程如下:(1) 使用WSAStartup( )函數(shù)檢查系統(tǒng)協(xié)議棧的安裝情況。只有在協(xié)議棧正確安裝的情況下,才可以執(zhí)行以下的各步驟。2常用的調(diào)用格式有如下兩種:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2

2、,2),&wsaData);注意,這里所使用的Winsock為版,也可以使用其他版本的Winsock。(2) 使用socket( )或WSASocket( )函數(shù)創(chuàng)建服務器端通信的套接口。如果套接口創(chuàng)建不成功,也不能執(zhí)行以下的各步操作,并且要調(diào)用WSACleanup( )函數(shù),結(jié)束Windows Sockets API的使用。這一步調(diào)用過程確定了相關(guān)五元組的協(xié)議。3常用的調(diào)用格式有如下幾種:SOCKET serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);SOCKET serverSocket=socket(AF_INET,SOCK_STR

3、EAM,0);SOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);SOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);注意,調(diào)用不成功時返回INVALID_SOCKET。4(3) 使用bind( )函數(shù)將創(chuàng)建的套接口與服務器地址綁定。它確定了相關(guān)五元組中的本地IP地址和端口號。常用調(diào)用格式如下: bind(serverSocket,(const struct s

4、ockaddr*)&localaddr,sizeof(sockaddr);bind(serverSocket,(SOCKADDR*)&localaddr,sizeof(sockaddr);bind(serverSocket,(sockaddr*)&localaddr,sizeof(sockaddr);bind(serverSocket,(LPSOCKADDR)&localaddr,sizeof(sockaddr);注意,本機地址有多種表示方法,它們是等價的。5(4) 使用listen()函數(shù)使服務器套接口做好接收連接請求的準備。該函數(shù)的調(diào)用格式如下:listen(serverSocket,qu

5、euelen);注意,第二個參數(shù)是請求隊列的長度,用以限制排隊請求的客戶數(shù),它與協(xié)議的實現(xiàn)有關(guān),一般給queuelen賦值為5。(5) 使用accept()或WSAAccept()函數(shù)接收來自客戶端由connect()發(fā)出的連接請求。常用格式如下:SOCKET Newsock=accept(serverSocket,(struct sockaddr*)&clientaddr,&clientaddr_len);在該函數(shù)的參數(shù)中,由clientaddr參數(shù)返回客戶端協(xié)議、IP地址和端口信息。至此,一個通信所需的五元組已建立。6(6) 根據(jù)連接請求建立連接后,使用send()或WSASend()函數(shù)

6、發(fā)送數(shù)據(jù),或使用recv()或WSARecv()函數(shù)接收數(shù)據(jù)。調(diào)用方法見后面的實例。(7) 使用closesocket()函數(shù)關(guān)閉套接口。它的使用方法如下:closesocket(serverSocket);(8) 最后調(diào)用WSACleanup()函數(shù),結(jié)束Windows Sockets API的使用。它是一個無參函數(shù),在程序中直接調(diào)用即可,即WSACleanup();至此,服務器的工作過程結(jié)束。當然實際的服務器程序是比較復雜的,這里只是對它的基本流程進行了說明。72客戶端程序工作流程客戶端相對服務器端來說,其工作過程較為簡單。客戶端應用程序的工作流程如下:(1) 使用WSAStartup()

7、函數(shù)檢查系統(tǒng)協(xié)議棧的安裝情況。其調(diào)用格式與服務器端是相同的,即WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);8 (2) 使用socket()或WSASocket()函數(shù)創(chuàng)建客戶端套接口。其調(diào)用格式同服務器端是一樣的,即:SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);(3) 使用connect()或WSAConnect()函數(shù)發(fā)出與服務器建立連接的請求。常用格式如下:connect(clientSocket,(struct sockaddr*

8、)&serveraddr,sizeof(serveraddr);9如果客戶想連接的計算機沒有監(jiān)聽指定端口的進程,則請求連接的connect()調(diào)用就會失敗,并發(fā)生代碼為WSAECONNREFUSED的錯誤。另一種常見的錯誤代碼是WSAETIMEDOUT,這種情況一般發(fā)生在試圖連接的計算機不能用時,如客戶與要連接的服務器之間路由不通、服務器主機硬件故障或者服務器不在網(wǎng)絡上等。注意,serveraddr參數(shù)是指向遠程服務器地址的一個指針,因此要調(diào)用此函數(shù)前一定要知道遠程服務器的地址和端口號,并把其值賦給serveraddr結(jié)構(gòu)量,否則無法使用該函數(shù)。10 (4) 連接建立后,使用send()或WS

9、ASend()函數(shù)發(fā)送數(shù)據(jù),或使用recv()或WSARecv()函數(shù)接收數(shù)據(jù)。(5) 使用closesocket()函數(shù)關(guān)閉套接口。 (6) 最后調(diào)用WSACleanup()函數(shù),結(jié)束Windows Sockets API的使用。至此,一次客戶向服務器請求服務的過程結(jié)束。3服務器與客戶端五元組的建立第6章我們討論過服務器與客戶通信的過程要用一個五元組來標識。這個五元組是:11(協(xié)議,本地IP地址,本地端口號,遠程IP地址,遠程端口號)對于面向連接的(TCP協(xié)議)通信來說,服務器與客戶之間的連接建立完成后,這個五元組就建立了,如表7-1所示。 12表7-1 面向連接的通信過程中五元組的建立 1

10、34服務器與客戶通信過程模型圖 服務器與客戶進行上述通信的過程可以用圖7-1表示。要注意的是,在客戶端也可以使用bind( )調(diào)用進行地址綁定。圖7-1中數(shù)據(jù)的交換部分在實際程序中有多種可能性,圖中只給出了一種服務器端先接收數(shù)據(jù)然后再發(fā)送數(shù)據(jù)的情況。14圖7-1 面向連接的客戶/服務器程序工作模型 157.1.2 無連接的客戶/服務器程序工作流程無連接的數(shù)據(jù)報(SOCK_DGRAM)傳輸服務在傳輸層使用UDP協(xié)議。與面向連接的通信過程不同,它的最大特點是不需要在客戶和服務器之間先建立連接,通信的任何一方可以先發(fā)送數(shù)據(jù),這樣首先發(fā)送數(shù)據(jù)的一方就成了客戶端,而接收數(shù)據(jù)的一方就是服務器端。在數(shù)據(jù)傳輸

11、完成后,只要關(guān)閉套接口,釋放網(wǎng)絡資源,通信過程就結(jié)束了。無連接的數(shù)據(jù)報傳輸服務通信時,客戶端與服務器端所使用的函數(shù)是類似的。其工作流程如下:16(1) 使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧的安裝情況。使用格式為:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);(2) 使用socket()或WSASocket()函數(shù)創(chuàng)建套接口,以確定相關(guān)五元組的協(xié)議。調(diào)用格式有如下幾種:SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);SOCKET s=socket(AF_IN

12、ET,SOCK_DGRAM,0);SOCKET17s=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);SOCKET s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED); 18(3) 使用bind()函數(shù)將創(chuàng)建的套接口與本地地址綁定。它確定了相關(guān)五元組中的本地IP地址和端口號。常用格式如下:bind(s,(const struct sockaddr*)&localaddr,sizeof(sockaddr);(4) 使用sendto()或W

13、SASendTo()函數(shù)發(fā)送數(shù)據(jù),使用recvfrom()或WSARecvFrom()函數(shù)接收數(shù)據(jù)。(5) 使用closesocket()函數(shù)關(guān)閉套接口。(6) 調(diào)用WSACleanup()函數(shù),結(jié)束Windows Sockets API的使用。至此,一次無連接的數(shù)據(jù)報傳輸過程結(jié)束。無連接的客戶與服務器之間的交互通信模型可以用圖7-2表示。19圖7-2 無連接的客戶/服務器程序工作模型20在編寫無連接的客戶/服務器程序時,應該注意以下幾個問題:(1) 通信的一方可以不用bind( )綁定IP地址和端口,而由系統(tǒng)自動分配。(2) 不綁定IP地址和端口的一方必須首先向綁定地址的一方發(fā)送數(shù)據(jù)。(3)

14、 無連接應用程序也可以調(diào)用connect( )函數(shù),但是它并不向?qū)Ψ桨l(fā)出建立連接的請求,內(nèi)核只是將connect( )中指定的目標方的IP地址和端口號記錄下來,在以后的通信中就可以使用面向連接的數(shù)據(jù)發(fā)送函數(shù)send( )和數(shù)據(jù)接收函數(shù)revc( )。21(4) 無連接的數(shù)據(jù)報傳輸過程中,作為服務器的一方也必須先啟動,否則客戶請求傳不到服務進程。 (5) 由于無連接的客戶端一般不調(diào)用connect( ),因此在數(shù)據(jù)發(fā)送之前,客戶與服務器之間尚未建立一個全相關(guān)(五元組),但各自通過socket( )和bind( )調(diào)用建立了半相關(guān)。發(fā)送數(shù)據(jù)時,發(fā)送方除指定本地套接口的地址外,還需指定接收方套接口的

15、地址,從而在數(shù)據(jù)收發(fā)過程中動態(tài)地建立全相關(guān)。227.2 基于TCP的客戶/服務器通信程序?qū)嵗?7.2.1 實例程序說明 實例程序使用的編程環(huán)境為當前常用的。為了便于大家理解用Socket進行網(wǎng)絡程序設計的原理,本程序使用了下的控制臺程序“Win32 Console Application”。控制臺程序的結(jié)構(gòu)一目了然,使程序中各種Winsock API調(diào)用都非常清楚。該程序中通信協(xié)議使用的是面向連接的TCP協(xié)議(SOCK_STREAM)。服務器端的IP地址使用系統(tǒng)指定的IP地址,端口號在程序中指定為5050,用符號常量來定義。 237.2.2 服務器端程序/*調(diào)試環(huán)境:服務器IP地址:由系統(tǒng)指定

16、服務器端口號:5050程序名稱:程序功能:服務器端的程序當有客戶提出連接請求時,在端口5050與客戶端進行TCP連接,24連接成功后,顯示客戶IP地址和端口號,并給客戶端發(fā)送 Hello! I am a server.字符串。如果發(fā)送正確則顯示所發(fā)送的字節(jié)數(shù)命令格式:server*/ #include#include#include/服務器使用的端口號為5050#define DEFAULT_PORT 5050void main( )25intiPort=DEFAULT_PORT; WSADATAwsaData; SOCKETsListen,sAccept;/客戶地址長度intiLen;/發(fā)送

17、的數(shù)據(jù)長度intiSend;/要發(fā)送給客戶的信息char buf =I am a server.;26/服務器和客戶的地址struct sockaddr_inser,cli;printf(-n);printf(Server waitingn);printf(-n);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) printf(Failed to load Winsock.n );return;27/創(chuàng)建服務器端套接口sListen=socket(AF_INET,SOCK_STREAM,0);if(sListen=INVALID_SOCKET)printf(s

18、ocket( )Failed:%dn, WSAGetLastError( );return; /以下建立服務器端地址 ser.sin_family=AF_INET;28/htons( )函數(shù)把一個雙字節(jié)主機字節(jié)順序的數(shù)轉(zhuǎn)換為網(wǎng)絡字節(jié)順序的數(shù)ser.sin_port=htons(iPort);/htonl( )函數(shù)把一個四字節(jié)主機字節(jié)順序的數(shù)轉(zhuǎn)換為網(wǎng)絡字節(jié)順序的數(shù)/使用系統(tǒng)指定的IP地址INADDR_ANYser.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)=SOCKET_ERROR)

19、printf(bind( ) Failed: %dn, WSAGetLastError( );return;29/進入監(jiān)聽狀態(tài)if(listen(sListen,5)=SOCKET_ERROR)printf(listen( ) Failed:%dn,WSAGetLastError( );return;/初始化客戶地址長度參數(shù)iLen=sizeof(cli);/進入一個無限循環(huán),等待客戶的連接請求30while(1)sAccept=accept(sListen,(struct sockaddr*)&cli,&iLen);if(sAccept=INVALID_SOCKET)printf(accep

20、t( ) Failed: %dn, WSAGetLastError( );break;31/輸出客戶IP地址和端口號printf(Accepted client IP:%s,port:%dn,inet_ntoa(cli.sin_addr),ntohs(cli.sin_port);/給連接的客戶發(fā)送信息iSend=send(sAccept,buf,sizeof(buf),0);if(iSend=SOCKET_ERROR)printf(send( ) Failed.:%dn, WSAGetLastError( );break;32elseif(iSend=0)break;elseprintf(se

21、nd( ) byte:%dn,iSend);printf(-n);closesocket(sAccept);closesocket(sListen);WSACleanup( );337.2.3 客戶端程序/*調(diào)試環(huán)境:程序名稱:客戶IP地址和端口:由系統(tǒng)指定程序功能:客戶端程序向服務器提出TCP連接的請求,當連接建立后,從服務器的端口505034接收數(shù)據(jù)并進行顯示,然后斷開與服務器的連接命令格式:client 服務器IP地址命令舉例:說明:上面設將要連接的服務器IP地址為,端口號為5050*/ 35#include#include/服務器端口號為5050#define DEFAULT_PORT

22、 5050#define DATA_BUFFER 1024void main(int argc,char *argv ) WSADATAwsaData;SOCKETsClient; int iPort= DEFAULT_PORT;36 /從服務器端接收的數(shù)據(jù)長度 int iLen; /接收數(shù)據(jù)的緩沖 charbufDATA_BUFFER; /服務器端地址 struct sockaddr_in ser; /判斷輸入的參數(shù)是否正確3738 if(argc2) /提示在命令行中輸入服務器IP地址printf(Usage:client server IP addressn);return; /接收數(shù)據(jù)

23、的緩沖區(qū)初始化 memset(buf,0,sizeof(buf); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) printf(Failed to load Winsock.n);return; 39/填寫要連接的服務器地址信息ser.sin_family=AF_INET;ser.sin_port=htons(iPort);/inet_addr( )函數(shù)將命令行的點分IP地址轉(zhuǎn)化為用二進制表示的網(wǎng)絡字節(jié)順序的IP地址ser.sin_addr.s_addr=inet_addr(argv1);/建立客戶端流式套接口sClient=socket(AF_INET,

24、SOCK_STREAM,0);if(sClient=INVALID_SOCKET)40printf(socket( ) Failed:%dn, WSAGetLastError( );return;/請求與服務器端建立TCP連接if(connect(sClient,(struct sockaddr*)&ser,sizeof(ser)=INVALID_SOCKET)printf(connect( ) Failed:%dn, WSAGetLastError( );return;41else/從服務器端接收數(shù)據(jù)iLen=recv(sClient,buf,sizeof(buf),0);if(iLen=0

25、)return;else if(iLen=SOCKET_ERROR)42printf(recv( ) Failed:%dn, WSAGetLastError( );return;printf(recv( ) data from server:%sn,buf); closesocket(sClient); WSACleanup( );437.2.4 程序執(zhí)行結(jié)果進行編譯與鏈接前,要注意以下幾個問題:(1) 在的“工程”“設置”“工程設置(Project Settings)”“Link”“對象/庫模塊”中加入“ws2_32.lib”。(2) 執(zhí)行VC+安裝目錄下文件夾“bin”中的“Vcvars3

26、2.bat”批處理文件。 (3) 如果要在一臺計算機上調(diào)試服務器和客戶程序,則服務器程序和客戶程序應該各開一個DOS窗口,并在其中顯示命令。 44(4) 服務器端程序在沒有錯誤發(fā)生或強行終止(Ctrl+Break)的情況下,將一直運行下去。圖7-3和圖7-4是客戶端程序和服務器端程序執(zhí)行的結(jié)果,它們是在同一臺裝有Windows 98操作系統(tǒng)的主機上執(zhí)行后的結(jié)果。該主機的IP地址設置為“”。客戶端程序共執(zhí)行了三次,每執(zhí)行一次,服務器端程序就顯示與其建立連接的客戶端IP地址和端口號并顯示發(fā)送給客戶的字節(jié)數(shù)。由于客戶端端口號由主機進行分配,所以從圖7-4中可以看出,每次執(zhí)行時主機都分配了不同的端口號

27、。45圖7-3 客戶端程序執(zhí)行結(jié)果 46圖7-4 服務器端程序執(zhí)行結(jié)果 477.3 基于UDP的客戶與服務器通信程序?qū)嵗?.3.1 實例程序說明本實例程序使用的編程環(huán)境為,使用的是控制臺程序“Win32 Console Application”。通信協(xié)議使用無連接的UDP協(xié)議(SOCK_DGRAM)。服務器端IP地址使用系統(tǒng)指定的IP地址,端口號在程序中指定為5050,用符號常量定義。服務器端從客戶端接收并顯示信息,服務器也向客戶端發(fā)送“Hello!I am a server.”信息??蛻舳讼蚍掌靼l(fā)送的信息為“Hello!I am a client.”,同時也接收從服務器發(fā)送的信息并進行顯示

28、??蛻舳顺绦驁?zhí)行時,從鍵盤輸入服務器的IP地址(即在命令行中輸入),客戶端口號由系統(tǒng)指定,服務器端口號指定為5050。487.3.2 服務器端程序/*調(diào)試環(huán)境:程序名稱:服務器IP地址:由系統(tǒng)指定服務器端口:5050功能: 從端口5050接收客戶端發(fā)送來的數(shù)據(jù),接收成功后顯示從客戶端收到的數(shù)據(jù)、客戶端的IP地址和端口號; 給客戶端發(fā)送Hello!I am a server.字符串命令格式:server*/ 49#include#include#include/服務器端口號為5050#define DEFAULT_PORT 5050/接收數(shù)據(jù)緩沖區(qū)長度#define BUFFER_LENGTH

29、1024void main( )50 intiPort=DEFAULT_PORT; WSADATAwsaData; SOCKETsSocket; /客戶地址長度 intiLen; /發(fā)送的數(shù)據(jù)長度 intiSend; /接收的數(shù)據(jù)長度 intiRecv;51 /要發(fā)送給客戶的信息 charsend_buf =Hello! I am a server.; /接收數(shù)據(jù)的緩沖區(qū) charrecv_bufBUFFER_LENGTH; /本地地址和客戶地址 struct sockaddr_inser,cli; printf(-n); printf(Server waitingn); printf(-n)

30、;52 if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) printf(Failed to load Winsock.n );return; /產(chǎn)生服務器端套接口 sSocket=socket(AF_INET,SOCK_DGRAM,0); if(sSocket=INVALID_SOCKET) printf(socket( ) Failed: %dn, WSAGetLastError();return; 53/以下建立服務器端地址 ser.sin_family=AF_INET; /htons( )函數(shù)把一個雙字節(jié)主機字節(jié)順序的數(shù)轉(zhuǎn)換為網(wǎng)絡字節(jié)順序的數(shù) ser.s

31、in_port=htons(iPort); /htonl( )函數(shù)把一個主機字節(jié)順序的數(shù)轉(zhuǎn)換為網(wǎng)絡字節(jié)順序的數(shù) ser.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser)=SOCKET_ERROR) printf(bind( ) Failed: %dn, WSAGetLastError( );return; 54 iLen=sizeof(cli); /初始化接收緩沖區(qū) memset(recv_buf,0,sizeof(recv_buf); /進入一個無限循環(huán),進行數(shù)據(jù)接收和發(fā)送 while

32、(1) /從客戶端接收數(shù)據(jù)iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);55if(iRecv=SOCKET_ERROR)printf(recvfrom( ) Failed.:%dn, WSAGetLastError( );break;elseif(iRecv=0)break;else56/輸出接收到的數(shù)據(jù)printf(recvfrom( ):%sn,recv_buf);/輸出客戶IP地址和端口號printf(Accepted client IP:%s,port:%dn,inet_ntoa(cli.s

33、in_addr),ntohs(cli.sin_port);57/給客戶發(fā)送信息iSend=sendto(sSocket,send_buf,sizeof(send_buf),0,(SOCKADDR*)&cli,sizeof(cli);if(iSend=SOCKET_ERROR)printf(sendto( ) Failed.:%dn, WSAGetLastError( );printf(-n);break;58elseif(iSend=0)break;elseprintf(sendto( ) succeeded!n);printf(-n); closesocket(sSocket); WSACl

34、eanup( );597.3.3 客戶端程序/*調(diào)試環(huán)境:程序名稱:客戶端IP地址和端口:由系統(tǒng)指定程序功能: 客戶端程序向服務器發(fā)送數(shù)據(jù)Hello! I am a client.; 客戶端程序從服務器接收數(shù)據(jù)并進行顯示命令格式:client 服務器IP地址命令舉例:說明:上面設要給IP地址為、端口號為5050的服務器發(fā)送數(shù)據(jù)*/ 60#include#include/服務器端口號為5050#define DEFAULT_PORT 5050/緩沖區(qū)長度#define DATA_BUFFER 1024void main(int argc,char *argv ) WSADATA wsaData;

35、 SOCKET sClient;61int iPort=5050; /服務器地址長度 int iLen; /接收數(shù)據(jù)的緩沖 int iSend; int iRecv; /要發(fā)送給服務器的信息 char send_buf =Hello! I am a client.; /接收數(shù)據(jù)的緩沖區(qū) char recv_bufDATA_BUFFER;62/服務器端地址 struct sockaddr_in ser; /處理命令行中輸入的參數(shù) if(argc2) /提示在命令行中輸入服務器IP地址printf(Usage:client server IP addressn);return;63 /接收數(shù)據(jù)的緩

36、沖區(qū)初始化 memset(recv_buf,0,sizeof(recv_buf); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) printf(Failed to load Winsock.n);return; 64 /建立服務器端地址 ser.sin_family=AF_INET; ser.sin_port=htons(iPort); ser.sin_addr.s_addr=inet_addr(argv1); /建立客戶端數(shù)據(jù)報套接口 sClient=socket(AF_INET,SOCK_DGRAM,0); if(sClient=INVALID_SOC

溫馨提示

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

評論

0/150

提交評論