您好,欢迎访问三七文档
《网络协议编程》实验指导实验1第页(共6页)1《网络协议编程》实验11.实验名称基于WinSockAPI的TCP网络程序的编写与分析。2.实验目的(1)掌握常用的WinSockAPI函数。(2)掌握基于WinSockAPI函数和TCP协议的网络通信控制台程序的编写方法。3.实验性质与实验课时(1)实验性质:验证性。(2)实验课时:2学时。4.实验环境计算机局域网、VisualC++6.05.实验内容(1)基于WinSockAPI函数和TCP协议的daytime网络程序的编写与分析①在VisualC++6.0中,编写daytime网络通信服务器程序。②在VisualC++6.0中,编写daytime网络通信客户端程序。(2)基于WinSockAPI函数和TCP协议的网络通信控制台程序的编写与分析①在VisualC++6.0中,编写基于WinSockAPI函数和TCP协议的网络通信控制台服务器程序。②在VisualC++6.0中,编写基于WinSockAPI函数和TCP协议的网络通信控制台客户端程序。(3)对编写好的网络通信程序在局域网两台不同的电脑上调试。(4)对编写好的网络通信程序在一台电脑上调试运行。6.实验步骤(1)基于WinSockAPI函数和TCP协议的daytime网络程序的编写与分析①在VisualC++6.0中,编写daytime网络通信服务器程序。服务器端程序代码如下:/***************************************************************daytime协议的服务器程序分析注解服务器端程序代码如下:服务器的IP地址:由系统指定服务器端口号:13《网络协议编程》实验指导实验1第页(共6页)2程序名称:daytime.cpp程序功能:实现由RFC—867定义的daytime协议命令格式:daytime***************************************************************/#includewinsock2.h#includestdio.h#includetime.h#pragmacomment(lib,WS2_32.lib)#defineMAX_BUFFER1024/*服务器缓冲区的最大值为1024个字符*///#defineNULL0#defineDAYTIME_SERVER_PORT13/*常量表示服务器的端口号为13*/intmain(){SOCKETserverFd;intconnectionFd,i=1;/*统计客户请求次数*/structsockaddr_inservaddr;chartimebuffer[MAX_BUFFER+1];time_tcurrentTime;WSADATAwsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData)==SOCKET_ERROR){printf(命令套接口初始化失败\n);WSACleanup();//终止使用WinsockDLL库,释放系统资源return-1;}serverFd=socket(AF_INET,SOCK_STREAM,0);/*创建服务器端的套接字,三个参数分别代表使用TCP/IP;传输过程使用TCP;不适用其他特殊协议*/if(serverFd==-1){printf(socketerror!\n);WSACleanup();//终止使用WinsockDLL库,释放系统资源return(-1);}memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/*将4字节主机字节数顺序转换到网络字节顺序*/《网络协议编程》实验指导实验1第页(共6页)3servaddr.sin_port=htons(DAYTIME_SERVER_PORT);/*将4字节主机字节数顺序转换到网络字节顺序*/if(bind(serverFd,(structsockaddr*)&servaddr,sizeof(servaddr))==SOCKET_ERROR)/*地址绑定*/{printf(bind()Failed:%d\n,WSAGetLastError());WSACleanup();//终止使用WinsockDLL库,释放系统资源return(-1);}listen(serverFd,5);/*监听客户端的连接请求,定义最大的链接次数为5次*/printf(daytime服务器已经启动,正在监听来自客户端的服务请求......\n);//运行界面上提示服务器软件处于启动状态while(1){connectionFd=accept(serverFd,(structsockaddr*)NULL,NULL);/*连接建立后将存放在缓冲区的时间发送到客户端*/if(connectionFd=0){currentTime=time(NULL);sprintf(timebuffer,%s\n,ctime(¤tTime));printf(已有%d个访问者\n,i++);send(connectionFd,timebuffer,strlen(timebuffer),0);closesocket(connectionFd);}}WSACleanup();//终止使用WinsockDLL库,释放系统资源return(1);}②在VisualC++6.0中,编写daytime网络通信客户端程序。客户端程序代码如下:/***************************************************************daytime协议的客户机端程序分析注解客户机端程序代码如下:服务器的IP地址:在程序中由程序员根据实际情况指定服务器端口号:13程序名称:clientdaytime.cpp程序功能:从daytime服务器获取时间命令格式:clientdaytime***************************************************************/#includewinsock2.h《网络协议编程》实验指导实验1第页(共6页)4#includestdio.h#includetime.h#pragmacomment(lib,WS2_32.lib)#defineMAX_BUFFER1024/*客户机缓冲区的最大值为1024个字符*/#defineDAYTIME_SERVER_PORT13/*常量表示服务器的端口号为13*/intmain(){SOCKETconnectionFd;intin;structsockaddr_inservaddr;chartimebuffer[MAX_BUFFER+1];time_tcurrentTime;WSADATAwsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData)==SOCKET_ERROR){printf(命令套接口初始化失败\n);return-1;}connectionFd=socket(AF_INET,SOCK_STREAM,0);/*创建服务器端的套接字,三个参数分别代表使用TCP/IP;传输过程使用TCP;不适用其他特殊协议*/if(connectionFd==-1){printf(socketerror!\n);return(-1);}memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(DAYTIME_SERVER_PORT);/*将4字节主机字节数顺序转换到网络字节顺序*///inet_addr()函数把字符串形式的IP地址转换为unsigedlong型的整数值servaddr.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);/*此处设置daytime服务器所在机器IP地址,应根据实际情况确定*/if(connect(connectionFd,(structsockaddr*)&servaddr,sizeof(servaddr))==INVALID_SOCKET){printf(connect()failed:%d\n,WSAGetLastError());//在界面上输出连接失败的错误提示信息return(0);}while((in=recv(connectionFd,timebuffer,MAX_BUFFER,0))0){timebuffer[in]=0;printf(\n%s,timebuffer);}《网络协议编程》实验指导实验1第页(共6页)5closesocket(connectionFd);WSACleanup();//终止使用WinsockDLL库,释放系统资源return(1);}(2)基于WinSockAPI函数和TCP协议的网络通信控制台程序的编写与分析①在VisualC++6.0中,编写基于WinSockAPI函数和TCP协议的网络通信控制台服务器程序。主要代码如下:#includewinsock2.h#includestdio.h#includewindows.h#pragmacomment(lib,WS2_32.lib)voidmain(){WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,0);err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=0){WSACleanup();return;}SOCKETS;SOCKETsockSrv;sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_INaddrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));listen(sockSrv,5);《网络协议编程》实验指导实验1第页(共6页)6SOCKADDR_INaddrClient;intlen=sizeof(SOCKADDR);while(1){SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);charsendBuf[50];sprintf(sendBuf,Welcome%stohere!,inet_ntoa(addrClient.sin_addr));send(sockConn,sendBuf,strlen(sendBuf)+1,0);charrecvBuf[50];recv(sockConn,recvBuf,50,0);printf(%s\n,recvBuf);closesocket(sockConn);}WSACleanup();}②在VisualC++6.0中,编写基于WinSockAPI函数和TCP协议的网络通信控制台客户端程序。主要代码如下:#includewinsock2.h#includestdio.h#includewindows.h#pragmacomment(lib,WS2_32.lib)voidmain(){WORDwVersion
本文标题:网络协议编程
链接地址:https://www.777doc.com/doc-2142124 .html