




已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)三、套接字編程序號: 姓名: 學(xué)號: 成績 一實(shí)驗(yàn)?zāi)康模簝扇艘唤M,編寫一個客戶端、服務(wù)器程序,掌握Socket編程原理。二實(shí)驗(yàn)環(huán)境:連入局域網(wǎng)絡(luò)的主機(jī)一臺。三實(shí)驗(yàn)指導(dǎo):Socket API是實(shí)現(xiàn)進(jìn)程間通信的一種編程設(shè)施,也是一種為進(jìn)程間提供底層抽象的機(jī)制。理解socket編程模型及其原理。四.運(yùn)行結(jié)果: 客戶端 服務(wù)端 五實(shí)驗(yàn)分析,回答下列問題。a.運(yùn)行指導(dǎo)書中的程序,并修改服務(wù)器的功能(自己思考),改寫成多線程web服務(wù)器(選作),附上源代碼,并加關(guān)鍵代碼注釋。b給出程序調(diào)試和運(yùn)行的截圖。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ù)運(yùn)行。(4) 如果程序在Turbo C環(huán)境下運(yùn)行,在服務(wù)器和客戶程序中還需要上面的內(nèi)容嗎?答:不需要。Turbo C 將文本編輯、程序編譯、連接以及程序運(yùn)行一體化, 大大方便了程序的開發(fā)。(5) 如果服務(wù)器程序中沒有memset(server.sin_zero, 0, sizeof(server.sin_zero);語句,程序會出現(xiàn)什么錯誤,為什么?答:對程序運(yùn)行沒有影響,這個語句的作用只是申請內(nèi)存初始化,這個軟件可以不用到這個語句。(6) 如果先運(yùn)行客戶端程序,程序會有什么現(xiàn)象,為什么會有這一現(xiàn)象?答:會顯示“Can not create connect!”并且無法進(jìn)行輸入。因?yàn)槿绻鄳?yīng)的服務(wù)端沒有打開,客戶端將不會找到它建立鏈接。(7) 如果服務(wù)器程序所在計(jì)算機(jī)沒有連接網(wǎng)絡(luò),程序會發(fā)生什么錯誤?我們捕獲到什么錯誤信息?答:無法進(jìn)行正常測試,服務(wù)端會顯示“binding stream socket:No error”。(8) 上述服務(wù)器是串行處理多個客戶端的請求,如何該成并發(fā)處理的服務(wù)器?答:調(diào)用accept和fork子函數(shù),這樣套接口fd 就可以與它們進(jìn)程之間共享,之后子程序就可以讀和寫已連接的套接口,變?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); /* 因?yàn)檫@個程序已經(jīng)有了一個無限循環(huán),所以套接字sock從來不顯式關(guān)閉。然而,當(dāng)進(jìn)程被殺死或正常終止時,所有套接字都將自動地被關(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 /* 客戶機(jī)連接遠(yuǎn)程主機(jī)的端口*/ #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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廚具銷售培訓(xùn)課件
- 2024年云南省人力資源社會保障廳下屬事業(yè)單位真題
- 2024年河北唐山國控港口管理有限公司招聘筆試真題
- 貴州省應(yīng)急管理廳事業(yè)單位真題2024
- 2024年咸陽市特崗教師招聘考試真題
- 2024年黔南州大學(xué)畢業(yè)生招聘事業(yè)單位人員考試真題
- 2024年海南公務(wù)員考試行測試題(A類)
- 記賬實(shí)操-鴕鳥養(yǎng)殖行業(yè)的賬務(wù)處理實(shí)例
- 2025屆湖北省恩施州利川市謀道鎮(zhèn)蘇馬蕩教育集團(tuán)英語八下期中考試試題含答案
- 奇異的植物講課件
- 一級圓柱齒輪減速器的設(shè)計(jì)計(jì)算22001文檔
- 第19章一次函數(shù)-一次函數(shù)專題數(shù)形結(jié)合一一次函數(shù)與45°角模型講義人教版數(shù)學(xué)八年級下冊
- 2023年四川省宜賓市敘州區(qū)數(shù)學(xué)六年級第二學(xué)期期末考試模擬試題含解析
- 幼兒園警察職業(yè)介紹課件
- 滅火器維修與報(bào)廢規(guī)程
- 皮膚病的臨床取材及送檢指南-修訂版
- 機(jī)型理論-4c172實(shí)用類重量平衡
- 校企合作項(xiàng)目立項(xiàng)申請表(模板)
- 管道工廠化預(yù)制推廣應(yīng)用課件
- 海水的淡化精品課件
- 項(xiàng)目工程移交生產(chǎn)驗(yàn)收報(bào)告
評論
0/150
提交評論