計(jì)算機(jī)網(wǎng)絡(luò)原理實(shí)驗(yàn)三_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)原理實(shí)驗(yàn)三_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)原理實(shí)驗(yàn)三_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)原理實(shí)驗(yàn)三_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)原理實(shí)驗(yàn)三_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)三、套接字編程1實(shí)驗(yàn)?zāi)康模簝扇艘唤M,編寫一個(gè)客戶端、服務(wù)器程序,掌握Socket編程原理。2實(shí)驗(yàn)環(huán)境:連入局域網(wǎng)絡(luò)的主機(jī)一臺。3實(shí)驗(yàn)指導(dǎo):Socket API是實(shí)現(xiàn)進(jìn)程間通信的一種編程設(shè)施,也是一種為進(jìn)程間提供底層抽象的機(jī)制。理解socket編程模型及其原理。4實(shí)驗(yàn)分析,回答下列問題。a.運(yùn)行指導(dǎo)書中的程序,并修改服務(wù)器的功能(自己思考),改寫成多線程web服務(wù)器(選作),附上源代碼,并加關(guān)鍵代碼注釋。服務(wù)器:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <

2、errno.h>#include<winsock2.h> #pragma comment(lib,"ws2_32.lib") #define MYPORT 3490 /*定義用戶連接端口*/ #define BACKLOG 10 /*多少等待連接控制*/ #define SERVER_IP_ADDR "113.55.34.41" /*服務(wù)器的IP地址*/ int _tmain(int argc, _TCHAR* argv)SOCKET sock, msgsock;#define PORT 3490 int length = 0; str

3、uct sockaddr_in server; struct sockaddr tcpaddr; char buf1024 = "" int rval= 0, len= 0, err = 0,i;/用于循環(huán) WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return -1; sock = socket(AF_INET, SOCK

4、_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); rval = bind(sock, (struct sockaddr *)&server, si

5、zeof(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 #%dn", ntohs(server.sin_port); listen

6、(sock, 5); len = sizeof(struct sockaddr); do msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len); if (msgsock = -1) perror("accept"); else for(i=0;i<=1000;i+)/循環(huán)控制memset(buf, 0, sizeof(buf); if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0) perror("reading

7、 stream message"); if (rval = 0)printf("%sn", buf); closesocket(msgsock); while (TRUE); closesocket(msgsock);return 0;客戶端:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <winsock2.h> #pragma comment(lib,"ws2_32.

8、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 ,i; SOCKET fd; struct sockaddr_in servaddr; struct hostent* hp; char buf1024 = "" wVersionRequested = MAK

9、EWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return -1; if (fd = socket(AF_INET, SOCK_STREAM, 0) < 0) printf("Can not create socket!"); exit(2); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT);servaddr.sin_addr.S_un.S_addr=inet_addr(

10、"113.55.34.41"); memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero); rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr); if (rval < 0) printf("Can not create connect!"); exit(3); else for(i=0;i<=1000;i+)/循環(huán)控制 memset(buf, 0, 1024); scanf("%s",&bu

11、f); rval = send(fd, buf, strlen(buf) + 1,0); if(rval < 0) printf("Write error!"); closesocket(fd); exit(5);return 0;b給出程序調(diào)試和運(yùn)行的截圖。c.回答下列問題:(1) 為什么在服務(wù)器和客戶端要包含winsock2.h文件?答:用Winsock2 API,這樣有助于對異步、非阻塞Socket編程機(jī)制的理解。為了簡單起見,服務(wù)器端和客戶端的應(yīng)用程序均是基于MFC的標(biāo)準(zhǔn)對話框,網(wǎng)絡(luò)通信部分基于Winsock2 API實(shí)現(xiàn)。 (2) 為什么在服務(wù)器和客戶端程序

12、中要加入#pragma comment(lib,"ws2_32.lib") 語句,如果不加會出現(xiàn)什么問題?答:用該語句,指示編譯當(dāng)前單元時(shí),linker會優(yōu)先鏈接該preproccessor 指定的lib文件,這樣等于就告訴編譯器有這樣一個(gè)lib文件可以去鏈接 。如果不加就會出現(xiàn)類似“LNK2019: 無法解析的外部符號_imp_closesocket4,該符號在函數(shù)_wmain 中被引用”的錯(cuò)誤。(3) 為什么在服務(wù)器和客戶端程序中要使用WSAStartup函數(shù),如果不用程序會有什么問題? 答:使用Winsock庫函數(shù)之前,必須先調(diào)用函數(shù)WSAStartup,該函數(shù)負(fù)責(zé)初

13、始化動(dòng)態(tài)連接庫Ws2_32.dll. 若ws2_32.dll尚未初始化,是無法調(diào)用WSAGetLastError. WSAStartup是任何使用Winsock的應(yīng)用程序或者 DLL首先必須調(diào)用Winsock庫函數(shù).一方面它初始化 ws2_32.dll,另一方面他用于在應(yīng)該程序DLL與系統(tǒng)Winsock庫版本協(xié)商。所以,如果不用該函數(shù)程序?qū)o法按照正常的情況進(jìn)行。(4) 如果程序在Turbo C環(huán)境下運(yùn)行,在服務(wù)器和客戶程序中還需要上面的內(nèi)容嗎?答:不需要。(5) 如果服務(wù)器程序中沒有memset(server.sin_zero, 0,sizeof (server.sin_zero);語句,程序會出現(xiàn)什么錯(cuò)誤,為什么?答:此函數(shù)是為新申請的內(nèi)存做初始化工作。如果去掉該語句在理論上面應(yīng)該有錯(cuò)誤,但是在我的實(shí)際操作中卻沒有錯(cuò)誤,這個(gè)問題在我將繼續(xù)深究。(6) 如果先運(yùn)行客戶端程序,程序會有什么現(xiàn)象,為什么會有這一現(xiàn)象?答:無法連接。因?yàn)槿绻冗\(yùn)行客戶端的話,沒有服務(wù)器端等待,那么服務(wù)器端艱苦肯定無法給予響應(yīng),所以也就無法連接。(7) 如果服務(wù)器程序所在計(jì)算機(jī)沒有連接網(wǎng)絡(luò),程序會發(fā)生什么錯(cuò)誤?我們捕獲到什么錯(cuò)誤信息?答:無法連接。會出現(xiàn)報(bào)錯(cuò)。(8) 上述服務(wù)器是串行處理多個(gè)客戶端的請求,如何該成并發(fā)處理的服務(wù)器?答:用父進(jìn)程調(diào)用accept,然后調(diào)用fork,

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論