




已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
實驗三、套接字編程序號: 姓名: 學(xué)號: 成績 一實驗?zāi)康模簝扇艘唤M,編寫一個客戶端、服務(wù)器程序,掌握Socket編程原理。二實驗環(huán)境:連入局域網(wǎng)絡(luò)的主機一臺。三實驗指導(dǎo):Socket API是實現(xiàn)進程間通信的一種編程設(shè)施,也是一種為進程間提供底層抽象的機制。理解socket編程模型及其原理。四.運行結(jié)果: 客戶端 服務(wù)端 五實驗分析,回答下列問題。a.運行指導(dǎo)書中的程序,并修改服務(wù)器的功能(自己思考),改寫成多線程web服務(wù)器(選作),附上源代碼,并加關(guān)鍵代碼注釋。b給出程序調(diào)試和運行的截圖。c.回答下列問題:(1) 為什么在服務(wù)器和客戶端要包含winsock2.h文件?答:網(wǎng)絡(luò)編寫程序必須要有頭文件,否則編譯時會出錯。(2) 為什么在服務(wù)器和客戶端程序中要加入#pragma comment(lib,ws2_32.lib) 語句,如果不加會出現(xiàn)什么問題?答:其功能是連接“ws2_32.lib”這個庫,如果沒有這個語句,就無法得到相關(guān)網(wǎng)絡(luò)API的支持,編譯的時候就會出錯。(3) 為什么在服務(wù)器和客戶端程序中要使用WSAStartup函數(shù),如果不用程序會有什么問題?答:WSAStartup函數(shù)是應(yīng)用程式呼叫到 Windows Sockets DLL 函式中的第一個,只有呼叫成功后,才可以再呼叫其他 Windows Sockets DLL 的函式。如果不用這個函數(shù),編譯將會中止,無法繼續(xù)運行。(4) 如果程序在Turbo C環(huán)境下運行,在服務(wù)器和客戶程序中還需要上面的內(nèi)容嗎?答:不需要。Turbo C 將文本編輯、程序編譯、連接以及程序運行一體化, 大大方便了程序的開發(fā)。(5) 如果服務(wù)器程序中沒有memset(server.sin_zero, 0, sizeof(server.sin_zero);語句,程序會出現(xiàn)什么錯誤,為什么?答:對程序運行沒有影響,這個語句的作用只是申請內(nèi)存初始化,這個軟件可以不用到這個語句。(6) 如果先運行客戶端程序,程序會有什么現(xiàn)象,為什么會有這一現(xiàn)象?答:會顯示“Can not create connect!”并且無法進行輸入。因為如果相應(yīng)的服務(wù)端沒有打開,客戶端將不會找到它建立鏈接。(7) 如果服務(wù)器程序所在計算機沒有連接網(wǎng)絡(luò),程序會發(fā)生什么錯誤?我們捕獲到什么錯誤信息?答:無法進行正常測試,服務(wù)端會顯示“binding stream socket:No error”。(8) 上述服務(wù)器是串行處理多個客戶端的請求,如何該成并發(fā)處理的服務(wù)器?答:調(diào)用accept和fork子函數(shù),這樣套接口fd 就可以與它們進程之間共享,之后子程序就可以讀和寫已連接的套接口,變?yōu)椴l(fā)處理服務(wù)器。六. 修改之后的程序代碼:例如服務(wù)器IP:113.55.16.71服務(wù)端程序代碼:#include stdafx.h#include #include #include #include #include #include #include#include #pragma comment(lib,ws2_32.lib) #define MYPORT 3490 /*定義用戶連接端口*/ #define BACKLOG 10 /*多少等待連接控制*/ #define SERVER_IP_ADDR 113.55.16.71 /*服務(wù)器的IP地址*/ int _tmain(int argc, _TCHAR* argv) SOCKET sock, msgsock; int length = 0; struct sockaddr_in server; struct sockaddr tcpaddr; char buf1024 = ; int rval= 0, len= 0, err = 0; WORD wVersionRequested; WSADATA wsaData;/*指定socket版本,否則創(chuàng)建socket失敗,即使創(chuàng)建socket返回值不為-1,但是bind時會失敗*/ wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return -1; /* 建立套接字*/ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock 0) perror(opening stream socket); exit(1); /* 使用任意端口命名套接字*/ server.sin_family = AF_INET; server.sin_port = htons(MYPORT); server.sin_addr.s_addr = inet_addr(SERVER_IP_ADDR); memset(server.sin_zero, 0, sizeof(server.sin_zero); /將服務(wù)器地址與socket綁定在一起 rval = bind(sock, (struct sockaddr *)&server, sizeof(server); if (rval 0) perror(binding stream socket); exit(1); / 找出指定的端口號并打印出來 length = sizeof(server); if (getsockname(sock, (struct sockaddr *)&server, &length) 0) perror(getting socket name); exit(1); printf(Socket Port #%d.n, ntohs(server.sin_port);printf(Outstanding Message.n*n); / 開始接收連接,最大請求數(shù)為 listen(sock, 5); len = sizeof(struct sockaddr); do msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len); if (msgsock = -1) perror(accept); else for(;) /空循環(huán)語句,不限次數(shù)接受和發(fā)送memset(buf, 0, sizeof(buf); if ( (rval = recv(msgsock, buf, sizeof(buf),0) 0) /從已連接的套接口接收數(shù)據(jù) perror(reading stream message);/當(dāng)rval0的時提示錯誤信息 if (rval = 0) printf(Form Senter:n%sn, buf); printf(To Senter:n); scanf(%s,&buf); rval = send(msgsock, buf, strlen(buf) + 1,0);/當(dāng)rval=0的時,顯示客戶端的發(fā)送信息 closesocket(msgsock); while (strcmp(buf,bye); /* 因為這個程序已經(jīng)有了一個無限循環(huán),所以套接字sock從來不顯式關(guān)閉。然而,當(dāng)進程被殺死或正常終止時,所有套接字都將自動地被關(guān)閉。*/ closesocket(msgsock);return 0;客戶端程序代碼:#include stdafx.h#include #include #include #include #include #include #include #include #pragma comment(lib,ws2_32.lib) #define PORT 3490 /* 客戶機連接遠程主機的端口*/ #define MAXDATASIZE 100 /* 每次可以接收的最大字節(jié)*/ int _tmain(int argc, _TCHAR* argv) WORD wVersionRequested; WSADATA wsaData; int err = 0 ,rval = 0 ; SOCKET fd; struct sockaddr_in servaddr; struct hostent* hp; char buf1024 = ; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData );for(;) /空循環(huán)語句 if ( err != 0 ) return -1; if (fd = socket(AF_INET, SOCK_STREAM, 0) h_addr,hp-h_length); memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero);/和服務(wù)器創(chuàng)建連接 rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr); if (rval 0) printf(Can not create connect!); exit(3); /創(chuàng)建連接失敗 else printf(Enter Information:n*n);/提示輸入信息for(;) /空循環(huán)memset(buf, 0, 1024); printf(To Server:n); scanf(%s,&buf); rval = send(fd, buf, strlen(buf) + 1,0);/向服務(wù)器發(fā)送信息 if(rval 0) printf(Write error!); mem
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 老人牙齒健康課件
- 翻譯相關(guān)的課件
- 美術(shù)課件產(chǎn)品介紹
- 美術(shù)說播課課件
- 美術(shù)生職業(yè)生涯規(guī)劃
- 研發(fā)投入培訓(xùn)課件
- 美術(shù)史介紹課件
- 安全管理制度每三年全面修訂
- 安全生產(chǎn)事故二十類
- 生產(chǎn)安全事故刑事責(zé)任
- 2025年拍賣師資格(紙筆作答)高頻題庫新版
- 【高考模擬】山東省春季高考研究聯(lián)合體2024-2025學(xué)年高三上學(xué)期第一次聯(lián)合考試數(shù)學(xué)試題(含解析)
- 體育社會學(xué)(高教版)第十章《社會體育的社會學(xué)分析》
- 2024年河北唐山國控港口管理有限公司招聘筆試真題
- 2025新七年級語文下冊期末字音字形專題復(fù)習(xí)課件
- 妊娠合并貧血護理課件
- 左美馬嗪行業(yè)深度研究分析報告(2024-2030版)
- 旅游景區(qū)船舶管理制度
- 腦機接口硬件優(yōu)化-洞察及研究
- 2025年山東省中考數(shù)學(xué)試卷真題及答案詳解(精校打?。?/a>
- 2025至2030年中國有源相控陣雷達行業(yè)市場發(fā)展態(tài)勢及前景戰(zhàn)略研判報告
評論
0/150
提交評論