//
// 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