基于UDP的客户与服务器通信程序培训资料.doc
Good is good, but better carries it.精益求精,善益求善。基于UDP的客户与服务器通信程序-实验名称基于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地址、端口号=0编写代码程序一:服务器端#include<Winsock2.h>#include<stdio.h>#include<stdlib.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_bufBUFFER_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;elseprintf("recvfrom():%dn",recv_buf);printf("客户端的IP地址、端口号:%dn",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;elseprintf("sendto():调用成功!n");closesocket(sSocket);WSACleanup();流程图二:结束提示输入地址否输出调用失败开始带参main()定义变量WSAStartupSocket()Recvfrom()sendto()是是是是是否否否否WSAcleanup()Closesocket()Largc<2接收数据初始化缓冲区程序二:客户机端程序#include<Winsock2.h>#include<stdio.h>#include<stdlib.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"charrecv_bufDATA_BUFFER;structsockaddr_inser;if(argc<2)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()函数调用失败:%dn",WSAGetLastError();return;ser.sin_family=AF_INET;ser.sin_port=htons(iPort);ser.sin_addr.s_addr=inet_addr(argv1);iLen=sizeof(ser);isend=sendto(sClient,send_buf,sizeof(send_buf),0,(structsockaddr*)&ser,iLen);if(isend=SOCKET_ERROR)printf("sendto()函数调用失败:%dn",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()函数调用失败:%dn",WSAGetLastError();return;elseif(iRecv=0)return;elseprintf("sendto():%sn",recv_buf);printf("-n");closesocket(sClient);WSACleanup();6、编译程序7、查看运行8、出错分析实验总结1 函数功能是:完成Winsock服务的初始化,从而可以在应用程序当中调用任何一个WinsockAPI函数;2 函数调用成功时返回03 应用程序只能在一次成功的WSAStartup()调用之后才能进一步调用其它函数;实验心得完成此次的实验报告单后我的感受有:1、 对学过的知识不能够真正理解。2、 对学过的理论知识不能在实际问题中学以致用。3、 对循环语句的逻辑思维不理解。4、 对一些语句的使用语法模糊不清。不能正确的用了流程图来反映其代码的含义及其做题思路。-