当前位置:文档之家› 计算机网络基础7

计算机网络基础7

2
break; } //输出客户 IP 地址和端口号 printf("Accepted client IP:[%s],port:[%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_pБайду номын сангаасrt)); //给连接的客户发送信息 iSend=send(sAccept,buf,sizeof(buf),0); if(iSend==SOCKET_ERROR) { printf("send( ) Failed.:%d\n", WSAGetLastError( )); break; } else if(iSend==0) break; else { printf("send( ) byte:%d\n",iSend); printf("-------------------------------\n"); } closesocket(sAccept); } closesocket(sListen); WSACleanup( ); } 步骤 2:客户端程序设计 程序名称: client.cpp 客户 IP 地址和端口:由系统指定 程序功能:客户端程序向服务器提出 TCP 连接的请求,当连接建立后,从服务器的端口 5050 接收数据并进行显示,然后断开与 服务器的连接。 命令格式: client [服务器 IP 地址] #include<Winsock2.h> #include<stdio.h> //服务器端口号为 5050 #define DEFAULT_PORT 5050 #define DATA_BUFFER { WSADATA SOCKET int int //接收数据的缓冲 char buf[DATA_BUFFER];
4
closesocket(sClient); WSACleanup( ); } 步骤 3:程序执行及测试数据与实验结果 进行编译与链接前,要注意以下几个问题: (1)在 Visual C++6.0 的“工程 ”→“设置„”→“工程设置 (Project Settings)”→“Link” → “对象/库模块”中加入“ws2_32.lib” 。 (2)执行 VC++安装目录下文件夹 “bin”中的“Vcvars32.bat”批处理文件。 (3)如果要在一台计算机上调试服务器和客户程序,则服务器程序和客户程序应该各开一个 DOS 窗口,并在其中显示命令。 (4)服务器端程序在没有错误发生或强行终止 (Ctrl+Break)的情况下,将一直运行下去。 在同一台装有 Windows 操作系统的主机上执行的结果如图所示。该主机的 IP 地址设置为 “192.168.3.4” 。
电气与信息工程学院计算机系
计算机网络基础
实验名称: 班级: 组员: 实验地点: 实 3-209 日期: 2012-5-22 姓名: Socket 网络编程实验 学号:
实验报告
一、实验目的 1、掌握 TCP/IP 协议的基本知识; 2、理解 Socket 的基本概念和工作原理; 3、掌握客户/服务器应用程序的设计方法。 二、实验内容 设计并实现一个基于客户/服务器模式的应用程序。 在本实验中要求利用 CAsyncSocket 类编写一个简单的客户/服务器程序。 我们要实现一个“回声程序”。“回声程序”是指一个客户程序把数据发送给服务器,服务器收 到数据后,将收到的数据再原样发送给客户程序。 实验环境 PC 机 1 台; 实验步骤 该程序中通信协议使用的是面向连接的 TCP 协议(SOCK_STREAM)。服务器端的 IP 地址使 用系统指定的 IP 地址,端口号在程序中指定为 5050,用符号常量来定义。 步骤 1:服务器端程序设计 服务器 IP 地址:由系统指定 服务器端口号: 5050 程序名称: server.cpp 程序功能: 服务器端的程序当有客户提出连接请求时, 在端口 5050 与客户端进行 TCP 连接, 连接 成功后,显示客户 IP 地址和端口号,并给客户端发送 " Hello! I am a server."字符 串。如果发送正确则显示所发送的字节数。 命令格式: server #include<Winsock2.h> #include<stdio.h> #include<stdlib.h> //服务器使用的端口号为 5050 #define DEFAULT_PORT 5050 void main( ) { int iPort=DEFAULT_PORT; WSADATA wsaData;
教师:



6
客户端程序执行结果
服务器端程序执行结果 同时图一还进行了局域网的连接测试,其中服务端的 IP 地址为“192.168.3.3”, 服务端的 IP 地址为“192.168.3.4”。下图为在局域网内运行结果
5
客户端程序执行结果
服务器端程序执行结果 三、实验小结 这次实验经过老师得讲解及学习 PPT, 了解到这次实验得主要目的是让我们客户端与服务端的 连接测试,我们同组同学分别建好客户端与服务端的程序源代码,在对程序运行调试时,总是存 在错误,从新研究 PPT 后发现原来是没有进行工程的设置,按照 PPT 在 Visual C++6.0 的“工程” →“设置…”→“工程设置(Project Settings)”→“Link”→“对象/库模块”中加入“ws2_32.lib”,进行修改 后,调式成功,可以运行。与同组同学联机运行,试验成功。 由于时间充裕,所以我又自己同时运行了一下服务端与客户端,调试成功后,在开 DOS 窗口 时,不知道怎么才能使自己一台电脑既作为客户端又作为服务端,通过询问老师,原来需要同时 开两个窗口,分别充当服务端和客户端。之后成功地实现了客户端与服务端的连接。 通过这次实验,我大概了解了 socket 的工作原理,并且实现了此功能程序,这次实验也是本 学期计算机网络的最后一次实验,这几次实验使我对计算机网络有了更深的理解,不在只停留在 书本上,而有了实践方面的认识。 实验成绩:
3
1024
void main(int argc,char *argv[ ]) wsaData; sClient; iPort= DEFAULT_PORT; iLen;
//从服务器端接收的数据长度
//服务器端地址 struct sockaddr_in ser; //判断输入的参数是否正确 if(argc<2) { //提示在命令行中输入服务器 IP 地址 printf("Usage:client [server IP address]\n"); return; } //接收数据的缓冲区初始化 memset(buf,0,sizeof(buf)); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("Failed to load Winsock.\n"); return; } //填写要连接的服务器地址信息 ser.sin_family=AF_INET; ser.sin_port=htons(iPort); //inet_addr( )函数将命令行的点分 IP 地址转化为用二进制表示的网络字节顺序的 IP 地址 ser.sin_addr.s_addr=inet_addr(argv[1]); //建立客户端流式套接口 sClient=socket(AF_INET,SOCK_STREAM,0); if(sClient==INVALID_SOCKET) { printf("socket( ) Failed:%d\n", WSAGetLastError( )); return; } //请求与服务器端建立 TCP 连接 if(connect(sClient,(struct sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET) { printf("connect( ) Failed:%d\n", WSAGetLastError( )); return; } Else { //从服务器端接收数据 iLen=recv(sClient,buf,sizeof(buf),0); if(iLen==0) return; else if(iLen==SOCKET_ERROR) { printf("recv( ) Failed:%d\n", WSAGetLastError( )); return; } printf("recv( ) data from server:%s\n",buf); }
1
SOCKET sListen, sAccept; //客户地址长度 int iLen; //发送的数据长度 int iSend; //要发送给客户的信息 char buf[ ]="I am a server."; //服务器和客户的地址 struct sockaddr_in ser, cli; printf("-------------------------------\n"); printf("Server waiting\n"); printf("-------------------------------\n"); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("Failed to load Winsock.\n "); return; } //创建服务器端套接口 sListen=socket(AF_INET,SOCK_STREAM,0); if(sListen==INVALID_SOCKET) { printf("socket( )Failed:%d\n", WSAGetLastError( )); return; } //以下建立服务器端地址 ser.sin_family=AF_INET; //htons( )函数把一个双字节主机字节顺序的数转换为网络字节顺序的数 ser.sin_port=htons(iPort); //htonl( )函数把一个四字节主机字节顺序的数转换为网络字节顺序的数 //使用系统指定的 IP 地址 INADDR_ANY ser.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR) { printf("bind( ) Failed: %d\n", WSAGetLastError( )); return; } //进入监听状态 if(listen(sListen,5)==SOCKET_ERROR) { printf("listen( ) Failed:%d\n",WSAGetLastError( )); return; } //初始化客户地址长度参数 iLen=sizeof(cli); //进入一个无限循环,等待客户的连接请求 while(1) { sAccept=accept(sListen,(struct sockaddr*)&cli,&iLen); if(sAccept==INVALID_SOCKET) { printf("accept( ) Failed: %d\n", WSAGetLastError( ));
相关主题