实验名称基于UDP的客户与服务器通信程序所属课程名称TCP/IP协议与网络编程实验时间2010/11/12实验地点信控系二机房学生姓名陈红梅实验器材及环境PC机、VisualC++6.0实验目的1.在C++环境中编写代码,调用WinsockAIP基本函数,实现一个基于UDP的客户/服务器通信程序。实验内容1.熟练掌握函数的调用及其编程;2.理解掌握基于UDP的客户/服务器通信程序;3.理解函数的WinsockAIP基本函数的调用、返回值的类型、函数功能等。实验步骤1、进入VisualC++6.02、创建一个空工程sy13、创建area.c文件4、流程图否iRecv=recvfrom()调用失败输出调用失败开始确定端口号输出服务器WSAStartupsListen=SocketBind()是是是否否否否1isend=sendto()!=0调用成功Closesocket(saccept)Closesocket(saccept)结束==0!=0输出接收到的数据、IP地址、端口号==05、编写代码程序一:服务器端#includeWinsock2.h#includestdio.h#includestdlib.h#defineDEFAULT_PORT5050#defineBUFFER_LENGTH1024#pragmacomment(lib,WS2_32.lib)voidmain(){intiPort=DEFAULT_PORT;WSADATAwsaData;SOCKETsSocket;intiLen,iRecv,iSend;structsockaddr_inser,cli;charsend_buf[]=Hollo!Iamaserver;charrecv_buf[BUFFER_LENGTH];printf(--------------------);printf(Serverwaiting);printf(--------------------);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf(环境初始化错误:\n);return;}sSocket=socket(AF_INET,SOCK_DGRAM,0);if(sSocket==INVALID_SOCKET){printf(socket()函数调用失败:\n,WSAGetLastError());return;}ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR){printf(bind()函数调用失败:\n,WSAGetLastError());return;}iLen=sizeof(cli);memset(recv_buf,0,sizeof(recv_buf));while(1){iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);if(iRecv==SOCKET_ERROR){printf(recvfrom()函数调用失败:\n,WSAGetLastError());break;}elseif(iRecv==0)break;else{printf(recvfrom():%d\n,recv_buf);printf(客户端的IP地址、端口号:%d\n,inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));}iSend=sendto(sSocket,send_buf,sizeof(send_buf),0,(SOCKADDR*)&cli,sizeof(cli));if(iSend==SOCKET_ERROR){printf(sendto()函数调用失败:\n,WSAGetLastError());break;}elseif(iSend==0)break;else{printf(sendto():调用成功!\n);}}closesocket(sSocket);WSACleanup();}流程图二:程序二:客户机端程序#includeWinsock2.h#includestdio.h#includestdlib.h#defineDEFAULT_PORT5050#defineDATA_BUFFER1024#pragmacomment(lib,WS2_32.lib)voidmain(intargc,char*argv[]){WSADATAwsaData;SOCKETsClient;intiPort=5050;intiLen;intisend,iRecv;charsend_buf[]=Hello!Iamaclient;结束提示输入地址否输出调用失败开始带参main()定义变量WSAStartupSocket()Recvfrom()sendto()是是是是是否否否否WSAcleanup()Closesocket()Largc2接收数据初始化缓冲区charrecv_buf[DATA_BUFFER];structsockaddr_inser;if(argc2){printf(输入服务器的IP地址:\n);return;}elsememset(recv_buf,0,sizeof(recv_buf));if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf(Winsock环境初始化失败:\n);return;}sClient=socket(AF_INET,SOCK_DGRAM,0);if(sClient==INVALID_SOCKET){printf(socket()函数调用失败:%d\n,WSAGetLastError());return;}ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=inet_addr(argv[1]);iLen=sizeof(ser);isend=sendto(sClient,send_buf,sizeof(send_buf),0,(structsockaddr*)&ser,iLen);if(isend==SOCKET_ERROR){printf(sendto()函数调用失败:%d\n,WSAGetLastError());return;}elseif(isend==0)return;elseprintf(sendto()调用成功:\n);iRecv=recvfrom(sClient,recv_buf,sizeof(recv_buf),0,(structsockaddr*)&ser,&iLen);if(iRecv==SOCKET_ERROR){printf(recvfrom()函数调用失败:%d\n,WSAGetLastError());return;}elseif(iRecv==0)return;else{printf(sendto():%s\n,recv_buf);printf(-------------------------------\n);}closesocket(sClient);WSACleanup();}6、编译程序7、查看运行8、出错分析实验总结1.函数功能是:完成Winsock服务的初始化,从而可以在应用程序当中调用任何一个WinsockAPI函数;2.函数调用成功时返回03.应用程序只能在一次成功的WSAStartup()调用之后才能进一步调用其它函数;实验心得完成此次的实验报告单后我的感受有:1、对学过的知识不能够真正理解。2、对学过的理论知识不能在实际问题中学以致用。3、对循环语句的逻辑思维不理解。4、对一些语句的使用语法模糊不清。不能正确的用了流程图来反映其代码的含义及其做题思路。