TCP程序設計(c語言課程設計)(共26頁)_第1頁
TCP程序設計(c語言課程設計)(共26頁)_第2頁
TCP程序設計(c語言課程設計)(共26頁)_第3頁
TCP程序設計(c語言課程設計)(共26頁)_第4頁
TCP程序設計(c語言課程設計)(共26頁)_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優質文檔-傾情為你奉上 第十章 TCP協議,即傳輸控制協議(Transport Control Protocol),是一種面向連接的、可靠的傳輸層協議。TCP協議是為了在主機實現高可性包交換的傳輸協議,在計算機網絡中用途很廣泛。本章將通過C程序語言編程來實現一個基于TCP協議的程序,旨在向讀者介紹TCP的實現原理,并進一步向讀者介紹C語言網絡編程技術。關于TCP的原理知識,讀者可參見第2章。10.1 設計目的本章通過C 語言編程實現了一個TCP程序包括服務器端程序和客戶端程序,程序能實現基本的通信。通過本程序向讀者展示了TCP的服務器端和客戶端的操作流程,用以加深讀者對TCP原理的理解。本

2、章的部分知識點在前面章節也有所涉及,讀者可以由此加深印象。通過本章的學習,讀者應該對以下知識點有一定的了解:Winsock版本的設置、Winsock庫的加載以及Winsock錯誤號的獲取;套接字的創建和關閉;TCP服務器的操作流程、客戶端的操作流程;套接字的綁定、偵聽、連接和接收操作;數據報的發送和接收;根據地址獲取主機、根據主機名獲取IP地址等信息;線程餓創建和參書設置;字符串比較函數的使用等。 讀者可以在本章的基礎上加以拓展,深刻理解TCP原理,掌握TCP編程方法和技巧,開發出自己的TCP程序。10.2 功能描述 本章用C語言實現了基于TCP的服務器端和客戶端程序,能實現基本的TCP通信。

3、其主要的功能包括如下。(1) 服務器端能以默認選項(服務器端IP地址或主機名、端口號)啟動,提供服務功能。(2) 服務器端能根據用戶指定的選項(服務器端IP地址或主機名、端口號)啟動,提供服務和功能。(3) 服務器以錯誤選項啟動時,會提示錯誤信息,并終止程序。(4) 客戶端能連接到服務器端,發送消息到服務器端,同時也能接收來自服務器的響應。(5) 客戶端不能連接到服務器端時,能輸出錯誤信息。(6) 客戶端以錯誤選項啟動時,會提示錯誤信息,并終止程序。10.3總體設計10.3.1 功能模塊設計1. 個功能模塊圖本程序由兩大部分組成,包括服務器端和客戶端,如圖10.1所示。服務器端包含的模塊有初始

4、模塊、循環控制模塊和服務模塊;客戶端包含的模塊有初始化模塊、功能控制模塊和數據傳輸控制模塊。1) 服務器端(1) 初始化模塊用于初始化各個全局變量賦初始值。初始化Winsock,加載Winsock庫。(2) 功能模塊控制。該模塊為其他模塊提供調用的函數,包括參數獲取功能、用戶幫助功能和錯誤輸出功能 。(3) 循環控制模塊。該模塊用于控制服務器端的服務次數,如果服務次數超過指定的值則停止服務器。(4) 服務模塊。該模塊為客戶端提供服務功能,包括接收來自客戶端的數據,并發送數據到客戶端。2) 客戶端(1) 初始化模塊。該模塊用于初始化客戶端的Winsock,加載Winsock庫。(2) 功能模塊控

5、制。與服務器端一樣,該模塊提供了參數獲取、用戶幫助和錯誤輸出功能。(3) 數據傳輸控制模塊。該模塊控制著整個客戶端的數據傳輸,包括數據發送和接收等。TCP程序設計 客戶端 服務器端初始化模塊功能控制模塊數據傳輸控制模塊功能控制模塊初始化模塊服務模塊循環控制模塊 圖 10.1 功能模塊圖2. 服務器端系統流程圖服務器端系統流程圖10.2所示。程序首先調用GetArgments()函數獲取用戶提供的先項,如果沒有提供選項,則直接使用默認值,如果有選項提供并成功獲取(選項錯誤則顯示用戶幫助并終止程序),則初始化變量和Winsock,并創建TCP流套接字;然后解析主機名(如果選項提供的是IP地址 ,或

6、者使用是默認值)或者IP地址(如果選項提供的是主機名),解析成功后則設置服務器地址的各個參數,包括地址、IP地址和端口號;接下來將創建的TCP流套接字和設定的服務器地址綁定(調用bing()函數);綁定成功后,則開始偵聽客戶的連接,調用循環控制函數LoopControl()函數和Service()函數作接收客戶端的連接,接收數據、發送數據等操作;當服務數達到最多的服務次數時,并提示錯誤信息(調用ErrorPrint()函數實現)。開始獲取參數獲取成功否是初始化變量和Winsock 創建套接字創建成功解析主機名或者IP地址否是解析成功否是設置服務器地址參數綁定地址與接字綁定成功 偵聽連接否是偵聽

7、成功否是 循環控制輸出相應錯誤信息釋放資源關閉服務結束 圖10.2 服務器端系統流程圖3. 客戶端系統流程圖客戶端系統流程圖如圖10.3所示。客戶端程序執行時必須帶選項,程序首先判斷用戶提供的參數個數,如果參數不等于3個,則比表明用戶沒有提供正確的選項,退出程序;如果參數等于3個,則調用GetArgments()函數獲取用戶提高的選項,如果獲取的選項錯誤則顯示用戶幫助并終止程序,如果選項正確則開始創建TCP流套接字,成功創建TCP流套接字后則作和服務器類似的操作,即解析主機名或IP地址、設置服務器端地址;然后進行連接服務器操作,若能成功連接則輸出連接信息,并發送消息到服務器端;然后接收來自服務

8、器端的響應,(消息),并將接收到的消息輸出。最后關閉套接字和釋放占用的資源。和服務器一樣,在操作過程中,任何一步操作失敗都將退出程序,并提示錯誤信息(調用ErrorPrint()函數實現)。開 始3個參數否是獲 取 參 數顯示用戶幫 助獲取成功否是創 建 套 接 字創建成功否是解析主機名或者IP地址解析成功否是設置服務器地址參數連 接服務器連接成功否是輸出連接信息發送 信息 到服 務 器 端接收服務器端的響應輸出相應錯誤信息釋 放 資 源 關閉 套 接 字結束圖 10.3 客戶端系統流程圖4. 循環控制模塊(服務器端)該模塊是服務器端用于循環控制的模塊,其操作流程如圖10.4所示。當服務器端偵

9、聽到客戶連接時,調用該模塊進行操作。首先接收客戶端的請求,接收成功后,根據傳入的參數is Multitasking判斷是否要創建一個線程來服務客戶端,如果is Multitasking是1則創建線程來服務客戶端(創建新線程時,設置了的初始堆棧大小為1000,線程執行函數是Service(),傳遞給Service()的參數為接收套接字),如果is Multitasking是0則直接調用 Service()函數來服務客戶端。一次服務成功后,判斷循環次數是否小于最大服務次數(可使用默認值,也可使用參數形式提供),如果已達到最大服務次數則關閉服務器,否則繼續進行下一次服務。開 始接收客戶端請求接收成功

10、?否是創建線程?否輸出錯誤信息是直接調用服務函數創建線程設置參數和服務函數還可以服務?是否結 束圖10.4 循環控制模塊流程圖5. 服務模塊(服務器端) 服務模塊用于在服務器端為客戶端服務,該模塊的實現較為簡單,主要進行接受和發送數據操作,其實現流程如圖10.5所示。首先用0初始化緩沖區response(數組),然后接收來自客戶端的數據,判斷接收到的數據是否是HELLO SERVER,如果不是則表示不是對應的客戶端,如果是則發送數據到客戶端。操作結束后關閉套接字。開 始初始 化 緩 沖區接收客戶端數據是預定義的數據?否輸出錯誤信息是發送消息到客戶端關閉套接字結 束圖 10.5 服務模塊實現流程

11、圖 6. 服務模塊(服務器端) 服務模塊用于在服務器端為客戶端服務,該模塊的實現較為簡單,主要進行接受和發送數據操作,其實現流程如圖10.5所示。首先用0初始化緩沖區response(數組),然后接收來自客戶端的數據,判斷接收到的數據是否是HELLO SERVER,如果不是則表示不是對應的客戶端,如果是則發送數據到客戶端。操作結束后關閉套接字。10.3.2數據結構設計本程序沒有定義結構體,在此僅講述服務器端和客戶端定義的全局變量。1. 服務器端 在服務器端定義了3個全局變量,分別是指向字符的指針hostName、無符號短整型變量maxService和無符號短整型port,各自表示的意義如下。c

12、har *hostName:該指針用于接收主機名選項,可以是IP地址,也可以是主機名。Unsigned short maxServer:用于存儲服務器端最大的服務次數,超過該次數,服務器將終止服務。Unsigned short port :用于存儲服務器端提供的端口號。這3個變量所存儲的值都是表示服務器啟動時提供的選項,如果服務器啟動時沒有提供這些選項,程序將按照默認設置的值啟動服務器。2. 客戶端客戶端提供了和服務器端累世的兩個全局變量,氣作用和意義都是和服務器端的相同,只是這兩個變量存儲的值在程序中沒有默認值,需要客戶端啟動是提供相應的選項。char* hostName:接收主機名選項。U

13、ndigned short port:用以存儲服務客戶端提供的端口號。10.3.3函數功能描述1. Initial()函數原型:void initial()Initial()函數用于初始化服務器端的全局變量,包括hostName、maxServerice和port,分別被初始化為“127.0.0.1”、“3”和“9999”。服務器在啟動時,若沒有指定這些選項,程序將使用這些默認值啟動服務器。2. InitSockets()函數原型:int InitSockts(void)InitSockets()函數用于初始化Winsock。3. GetArgment()函數原型:viod GetArgmen

14、t(int argc,char*argv)GetArgment()函數用于獲取用戶提供的選項,在服務器端能獲取的參數包括主機名(或IP地址)、最多服務次數和端口號。其中argc表示獲取的選項個數,argv用來存儲獲取的選項值,這個參數的值通過主函數的參數傳遞過來。4. ErrorPrint()函數原型:void ErrorPoint(x)ErrorPoint()函數用于輸出錯誤信息,該函數調用系統函數WSAGetLastError()來獲取錯誤號。其中X表示錯誤消息。5. userHelp()函數原型:void userHelp()userHelp()函數用于現實用戶幫戰。當服務器端啟動時,若

15、提供的選項錯誤,將調用該函數輸出用戶幫助信息,提供的信息包括選項的格式和類型。6. LoopControl()函數原型:int LoopControl(SOCKET listenfd,int isMultiTasking)LoopControl()函數用于循環控制,當服務器的服務次數在指定的范圍內,將接收客戶端的請求,并創建一個線程(如果需要的話)來為客戶端服務(調用Service()函數)。其中listenfd表示偵聽套接字,isMultiTasking是個標記,如果其設置為1,則創建一個線程來服務器端,如果其設置為0,則直接調用服務器函數來服務客戶端。7. Service()函數原型:vo

16、id Service(LPVOID lpv)Service()函數用于服務客戶端,包括接收客戶端的數據和發送數據到客戶端。2. 客戶端客戶端的這幾個函數在服務器端也出現過,其功能和服務器端的函數類似。1 InitSockets()函數原型:int InitSockets(void)InitSockets()函數用于初始化Winsock。2 GetArgument()函數原型:void GetArgument(int argc , char *argv)GetArguemnt()函數用于獲取用戶提供的選項,在客戶端能獲取的參數包括主機名(或IP地址)和端口號。其中argc和argv值也是通過主函

17、數的參數傳遞過來,其表示的意義和主函數中的一樣。3 ErrorPrint()函數原型:void Errorprint()ErrorPrint()函數用于輸出錯誤信息。4 userHelp()函數原型:void userHelp()userHelp()函數用于顯示用戶幫助。當客戶端不帶選項啟動時或帶錯誤選項啟動時將調用該函數顯示用戶幫助,顯示選項的格式和類型。10.4程序實現10.4.1 源碼分析1 服務端(service.c)1 程序預處理程序處理包括庫文件的導入、頭文件的加載以及常量和全局變量的定義 /*導入庫文件*/#pragma comment(lib,wsock32.lib)/*加載頭

18、文件*/#include #include /*自定義函數原型*/void initial();int InitSockets(void);void GetArgments(int argc, char *argv);void ErrorPrint(x);void userHelp();int LoopControl(SOCKET listenfd, int isMultiTasking);void Service(LPVOID lpv);/*定義常量*/#define MAX_SER 10/*定義全局變量*/char *hostName;unsigned short maxService;u

19、nsigned short port;2初始化模塊初始化模塊由兩部分組成,包括全局變量的初始化和Winsock的初始化,由兩個函數來實現1 void initial(),初始化全局變量,其中hostName被賦值為“127.0.0.1”,表明程序在運行是僅限制客戶端和服務器端在同一主機上進行,如果要改變該值,需要在服務器啟動是,設置hostName選項,重新賦值;maxService表示最大的服務次數,其值應該不大于MAX SER代表的值。2 int InitSockets(void),初始化Winsock,包括初始化套接字版本號和加載Winsockku。/*初始化全局變量函數*/void i

20、nitial() hostName = 127.0.0.1; maxService = 3; port = 9999;/*初始化Winsocket函數*/int InitSockets(void) WSADATA wsaData; WORD sockVersion; int err; /*設置Winsock版本號*/ sockVersion = MAKEWORD( 2, 2 ); /*初始化Winsock*/ err = WSAStartup( sockVersion, &wsaData ); /*如果初始化失敗*/ if ( err != 0 ) printf(Error %d: Winso

21、ck not availablen, err); return 1; return 03. 功能控制模塊功能控制模塊提供了參數獲取功能、錯誤輸出功能和用戶幫助功能,這幾個功能分別由GetArgments(int argc ,char *argv),獲取用戶提供的選項值。該函數首先判斷每個參數的第一個字符,如果第一個字符是“-”(短橫線)則表示該參數是用戶提供的選項。提供的選項包括“-p(-p)”,表示端口號;“-h(-H)”,表示主機名(或者ip地址);“-n(-N)”,表示服務器端的最多服務次數,超過該服務次數服務器將自動停止。(2) void ErrorPrint(x),錯誤輸出函數。(3

22、) void userHelp(),顯示用戶幫助函數。在GetArgments()函數中,如果獲取的選項值不是預定義的值,則調用該函數輸出用戶幫助。/*獲取選項函數*/void GetArgments(int argc, char *argv) int i; for(i=1; i 3) port = atoi(&argvi3); break; /*若是主機名*/ case h: hostName = &argvi3; break; /*最多服務次數*/ case n: maxService = atoi(&argvi3); break; /*其他情況*/ default: userHelp()

23、; break; return;/*錯誤輸出函數*/void ErrorPrint(x) printf(Error %d: %sn, WSAGetLastError(), x);/*用戶幫助函數*/void userHelp() printf(userHelp: -h:str -p:int -n:intn); printf( -h:str The host name n); printf( The default host is 127.0.0.1n); printf( -p:int The Port number to usen); printf( The default port is 9

24、999n); printf( -n:int The number of service,below MAX_SER n); printf( The default number is 3n); ExitProcess(-1);4) 循環控制模塊 循環控制模塊的功能是由LoopControl()函數實現的。具體步驟可參見10.3.3節中的函數功能描述其操作流程圖可參見圖10.4。/*循環控制函數*/int LoopControl(SOCKET listenfd, int isMultiTasking) SOCKET acceptfd; struct sockaddr_in clientAddr;

25、 int err; int nSize; int serverNum = 0; HANDLE handlesMAX_SER; int myID; /*服務次數小于最大服務次數*/ while (serverNum maxService) nSize = sizeof(clientAddr); /*接收客戶端請求*/ acceptfd = accept(listenfd, (struct sockaddr *) &clientAddr, &nSize); /*如果接收失敗*/ if (acceptfd = INVALID_SOCKET) ErrorPrint(Error: accept fail

26、edn); return 1; /*接收成功*/ printf(Accepted connection from client at %sn, inet_ntoa(clientAddr.sin_addr); /*如果允許多任務執行*/ if (isMultiTasking) /*創建一個新線程來執行任務,新線程的初始堆棧大小為1000,線程執行函數 是Service(),傳遞給Service()的參數為acceptfd*/ handlesserverNum = CreateThread(NULL, 1000, (LPTHREAD_START_ROUTINE)Service, (LPVOID)

27、acceptfd, 0, &myID); else /*直接調用服務客戶端的函數*/ Service(LPVOID) acceptfd); serverNum+; if (isMultiTasking) /*在一個線程中等待多個事件,當所有對象都被通知時函數才會返回,并且等待沒有時間限制*/ err = WaitForMultipleObjects(maxService, handles, TRUE, INFINITE); printf(Last thread to finish was thread #%dn, err); return 0;5) 服務模塊 服務模塊的功能由函數Service

28、()來實現。其功能主要是接收、判斷來自客戶端的數據,以及發送數據到客戶端。Service()函數首先接收客戶端發送來的數據,存放到緩沖區response中,然后判斷接收到的數據是否和預定義的數據“HELLO SERVER”相同,如果相同則發送消息到客戶端,并關閉套接字;否則,輸出錯誤信息并關閉套接字。其實現流程圖可參見圖10.5。/*服務函數*/void Service(LPVOID lpv) SOCKET acceptfd = (SOCKET) lpv; const char *msg = HELLO CLIENT; char response4096; /*用0初始化response409

29、6數組*/ memset(response, 0, sizeof(response); /*接收數據,存入response中*/ recv(acceptfd, response, sizeof(response), 0); /*如果接收到的數據和預定義的數據不同*/ if (strcmp(response, HELLO SERVER) printf(Application: client not using expected protocol %sn, response); else /*發送服務器端信息到客戶端*/ send (acceptfd, msg, strlen(msg)+1, 0)

30、; /*關閉套接字*/ closesocket(acceptfd);6) 主函數 主函數控制著整個程序的流程,包括套接字的創建、綁定、偵聽和釋放,以及對各個模塊中函數的調用等。其具體操作流程圖可參見圖10.2。/*主函數*/int main(int argc, char *argv) SOCKET listenfd; int err; struct sockaddr_in serverAddr; struct hostent *ptrHost; initial(); GetArgments(argc,argv); InitSockets(); /*創建TCP流套接字,在domain參數為PF_

31、INET的SOCK_STREAM套接口中,protocol參數為0意味 著告訴內核選擇 IPPRPTP_TCP,這也意味著套接口將使用TCP/IP協議*/ listenfd = socket(PF_INET, SOCK_STREAM, 0); /*如果創建套接字失敗*/ if (listenfd = INVALID_SOCKET) printf(Error: out of socket resourcesn); return 1; /*如果是IP地址*/ if (atoi(hostName) /*將IP地址轉換成32二進制表示法,返回32位二進制的網絡字節序*/ u_long ip_addr

32、= inet_addr(hostName); /*根據IP地址找到與之匹配的主機名*/ ptrHost = gethostbyaddr(char *)&ip_addr, sizeof(u_long), AF_INET); /*如果是主機名*/ else /*根據主機名獲取一個指向hosten的指針,該結構中包含了該主機所有的IP地址*/ ptrHost = gethostbyname(hostName); /*如果解析失敗*/ if (!ptrHost) ErrorPrint(cannot resolve hostname); return 1; /*設置服務器地址*/ /*設置地址族為PF_

33、INET*/ serverAddr.sin_family = PF_INET; /*將一個通配的Internet地址轉換成無符號長整型的網絡字節序數*/ serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /*將端口號轉換成無符號短整型的網絡字節序數*/ serverAddr.sin_port = htons(port); /*將套接字與服務器地址綁定*/ err = bind(listenfd, (const struct sockaddr *) &serverAddr, sizeof(serverAddr); /*如果綁定失敗*/ if (err

34、 = INVALID_SOCKET) ErrorPrint(Error: unable to bind socketn); return 1; /*開始偵聽,設置等待連接的最大隊列長度為SOMAXCONN,默認值為5個*/ err = listen(listenfd, SOMAXCONN); /*如果偵聽失敗*/ if (err = INVALID_SOCKET) ErrorPrint(Error: listen failedn); return 1; LoopControl(listenfd, 1); printf(Server is downn); /*釋放Winscoket初始化時占用的

35、資源*/ WSACleanup(); return 0; 117.73.130.1622. 客戶端(client.c)1) 程序預處理 與服務器一樣,客戶端的預處理也包括庫文件的導入、頭文件的加載和全局變量的定義。/*導入庫文件*/#pragma comment(lib,wsock32.lib)/*加載頭文件*/#include #include /*自定義函數*/int InitSockets(void);void GetArgument(int argc, char *argv);void ErrorPrint(x);void userHelp();/*定義全局變量*/unsigned s

36、hort port;char *hostName;2) 初始化模塊 因為不存在對全局變量賦初始值,所以客戶端的初始化模塊僅僅初始化Winsock,包括初始化套接字版本號加載Winsock庫。/*初始化Winsock函數*/int InitSockets(void) WSADATA wsaData; WORD sockVersion; int err;/*設置Winsock版本號*/ sockVersion = MAKEWORD( 2, 2 ); /*初始化Winsock*/ err = WSAStartup( sockVersion, &wsaData ); /*如果初始化失敗*/ if (

37、err != 0 ) printf(Error %d: Winsock not availablen, err); return 1; return 0;3) 功能控制模塊 功能控制模塊包括選項獲取功能、錯誤輸出功能和用戶幫助功能。這幾個功能分別由GetArgment()函數、ErrorPrint()函數和userHelp()函數來實現,這幾個函數和服務器端的函數功能、參數意義相同,在此就不再贅述。(1) void GetArgment(int argc,char *argv),獲取用戶提供的選項。(2) void ErrorPrint(x),輸出錯誤信息。(3) void userHelp(

38、),顯示用戶幫助。/*獲取選項函數*/void GetArgments(int argc, char *argv) int i; for(i=1; i 3) port = atoi(&argvi3); break; /*若是主機名*/ case h: hostName = &argvi3; break; /*其他情況*/ default: userHelp(); break; return;/*錯誤輸出函數*/void ErrorPrint(x) printf(Error %d: %sn, WSAGetLastError(), x);/*用戶幫助函數*/void userHelp() prin

39、tf(userHelp: -h:str -p:intn); printf( -h:str The host name n); printf( -p:int The Port number to usen); ExitProcess(-1);4) 數據傳輸控制模塊 客戶端程序把數據的輸入輸出部分都放在主函數中執行,即數據傳輸控制由主函數來實現。主函數中包括套接字的創建、綁定和釋放,服務器的連接,數據的發送、接收以及對各個模塊中函數的調用等。其具體操作流程圖可參見圖10.3。/*主函數*/int main(int argc, char *argv) SOCKET clientfd; int err

40、; struct sockaddr_in serverAddr; struct hostent *ptrHost; char response4096; char *msg = HELLO SERVER;GetArgments(argc, argv); if (argc != 3) userHelp(); return 1; GetArgments(argc,argv); InitSockets();/*創建套接字*/ clientfd = socket(PF_INET, SOCK_STREAM, 0);/*如果創建失敗*/ if (clientfd = INVALID_SOCKET) Err

41、orPrint(no more socket resources);return 1;/*根據IP地址解析主機名*/ if (atoi(hostName) u_long ip_addr = inet_addr(hostName); ptrHost = gethostbyaddr(char *)&ip_addr, sizeof(u_long), AF_INET); /*根據主機名解析IP地址*/ else ptrHost = gethostbyname(hostName);/*如果解析失敗*/ if (!ptrHost) ErrorPrint(cannot resolve hostname);r

42、eturn 1; /*設置服務器端地址選項*/serverAddr.sin_family = PF_INET; memcpy(char *) &(serverAddr.sin_addr), ptrHost-h_addr,ptrHost-h_length); serverAddr.sin_port = htons(port);/*連接服務器*/ err = connect(clientfd, (struct sockaddr *) &serverAddr, sizeof(serverAddr);/*連接失敗*/ if (err = INVALID_SOCKET)ErrorPrint(cannot

43、 connect to server);return 1;/*連接成功后,輸出信息*/ printf(You are connected to the servern);/*發送消息到服務器端*/ send (clientfd, msg, strlen(msg)+1, 0); memset(response, 0, sizeof(response);/*接收來自服務器端的消息*/ recv(clientfd, response, sizeof(response), 0); printf(server says %sn, response);/*關閉套接字*/ closesocket(clien

44、tfd);/*釋放Winscoket初始化時占用的資源*/ WSACleanup(); return 0; 提示: 由于在TC或者Win-TC中沒有編譯套接字的頭文件,所以該程序需要在Visual C+或者具有Winsock頭文件的編譯器中編譯。本章的服務器端和客戶端程序端都已經在Visual C+6.0中通過編譯。10.4.2 運行結果 本節將對服務器端和客戶端從兩個大方面進行測試,包括錯誤測試和帶選項(帶正確選項值)的測試。1 錯誤測試由于服務器端可以不帶選項進行啟動,所以對服務器端的錯誤測試主要是帶錯誤選項的測試;而客戶端的錯誤測試包括不帶選項啟動、帶不正確的端口號或者主機名啟動,以及服務器未啟動時啟動客戶端。1) 服務器端選項錯誤 如圖10。6所示,服務器端錯誤選項(“-1“)啟動時,則會顯示用戶幫助信息(選項格式和類型),并終止程序。 C:WINDOWSsystem32cmd.exeE:bookstrchapt10tcpDebugtcp.

溫馨提示

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

評論

0/150

提交評論