计算机网络实验指导书 下载本文

//

// Check for the host and port arguments //

if (argc != 3) { fprintf(stderr,\ return; }

nPort = atoi(argv[2]); //

// Initialize WinSock and check the version //

nRet = WSAStartup(wVersionRequested, &wsaData); if (wsaData.wVersion != wVersionRequested) { fprintf(stderr,\ return; } //

// Go do the stuff a stream client does //

StreamClient(argv[1], nPort); //

// Release WinSock //

WSACleanup(); }

////////////////////////////////////////////////////////////

void StreamClient(char *szServer, short nPort) {

printf(\ szServer, nPort);

//

// Find the server //

LPHOSTENT lpHostEntry;

lpHostEntry = gethostbyname(szServer); if (lpHostEntry == NULL) {

PRINTERROR(\ return;

45

} //

// Create a TCP/IP stream socket //

SOCKET theSocket;

theSocket = socket(AF_INET, // Address family SOCK_STREAM, // Socket type IPPROTO_TCP); // Protocol if (theSocket == INVALID_SOCKET) { PRINTERROR(\ return; } //

// Fill in the address structure //

SOCKADDR_IN saServer;

saServer.sin_family = AF_INET;

saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); // ^ Server's address saServer.sin_port = htons(nPort); // Port number from command line //

// connect to the server //

int nRet;

nRet = connect(theSocket, // Socket (LPSOCKADDR)&saServer, // Server address sizeof(struct sockaddr));// Length of server address structure if (nRet == SOCKET_ERROR) { PRINTERROR(\ closesocket(theSocket); return; } //

// Send data to the server //

char szBuf[256];

strcpy(szBuf, \ nRet = send(theSocket, // Connected socket szBuf, // Data buffer strlen(szBuf)+1, // Length of data 0); // Flags

46

}

if (nRet == SOCKET_ERROR) { PRINTERROR(\ closesocket(theSocket); return; } //

// Wait for a reply //

nRet = recv(theSocket, szBuf, sizeof(szBuf), 0); if (nRet == SOCKET_ERROR) { PRINTERROR(\ closesocket(theSocket); return; } //

// Display the received data //

printf(\closesocket(theSocket); return;

// Connected socket // Receive buffer

// Size of receive buffer // Flags

(三)示例运行 (略)

【实验步骤】

(一)TCP协议分析

运行给定的程序(由指导教师提供),采用”解码软件”跟踪捕获通信报文,

全面分析TCP通信机制。

分析连接时三次握手过程;

分析接收方是如何应答的;

断开连接时过程(用了几个Frame?);

弄清楚包顺序号的作用、及产生、变化的规律; 弄清楚如何实现流控的;

(二)UDP协议分析

运行给定的程序(由指导教师提供),采用”解码软件” 跟踪捕获通信报文,

47

全面分析UDP通信机制。

(三)程序设计调试、通信过程分析

1、实验前设计好程序(参见实验要求) 2、上机前,通过检查(处理),确保实验用机网络连接正常

3、运行开发工具,输入已设计好的程序代码(包括服务器端和客户端)

4、在单机上调试运行程序,选择一个长度为10k字节左右的数据文件,进行网络传输。 5、运行网络协议解码工具(如wireshark),跟踪程序整个通信过程,并进行分析。 建立连接

数据的发送与接收;

关闭连接 send(1) buffer 1518

6、修改源程序,将每次传输的数据(通过send方法调用)长度依次设定为1、100、1460、6000字节,运行程序,借助于网络协议解码工具,依次记录对应的在网络上所传输的有效数据包的个数,填写下表,并进行分析。 序号 1 2 3 4

文件分割尺度(字节) 10 100 1460 6000 文件总长(字文件分割块节) 数(个) 10311 1031+1 经网络传输的数据块数 9 传输效率(对发送方) 10311/()*100% 【实现提示】

1. 注意区别程序类型:控制台应用程序与Windows应用程序 可以在示例程序的基础之上完成设计与调试任务。

2.若采用C编程时,可参考使用下列文件操作语句或函数: (1)FILE * fp //定义文件指针 (2)fopen() //打开文件

(3)fread() //从文件中读出一块数据 (4)fwrite() //将一块数据写到从文件中

(5)feof() //判断文件是否结束(指针指向尾部,已无数据可读) (6)fclsoe() //关闭文件

3. 若采用C编程时,可考虑定义使用一个结构体,存放文件名、长度等信息, 发送方先发送该结构体,再发送文件的数据块流。

4. 运行网络协议解码工具(如sniffer pro),跟踪程序整个通信过程时,通信双方必须位于两台不同的微机上,在跟踪前需要按地址(IP)设定并使用filter,来capture通信双方的的数据包,filter的内容为双方的IP(双向)。

【分析与思考】

48