基于UDP的客户与服务器通信程序
基于UDP的客户与服务器通信程序本文简介:实验名称基于UDP的客户与服务器通信程序所属课程名称TCP/IP协议与网络编程实验时间2010/11/12实验地点信控系二机房学生姓名陈红梅实验器材及环境PC机、VisualC++6.0实验目的1.在C++环境中编写代码,调用WinsockAIP基本函数,实现一个基于UDP的客户/服务器通信程序。实
基于UDP的客户与服务器通信程序本文内容:
实验名称
基于UDP的客户与服务器通信程序
所属课程名称
TCP/IP协议与网络编程
实验时间
2010/11/12
实验地点
信控系二机房
学生姓名
陈红梅
实验器材及环境
PC机、Visual
C++
6.0
实验目的
1.
在C++环境中编写代码,调用Winsock
AIP基本函数,实现一个基于UDP的客户/服务器通信程序。
实验内容
1.
熟练掌握函数的调用及其编程;
2.
理解掌握基于UDP的客户/服务器通信程序;
3.
理解函数的Winsock
AIP基本函数的调用、返回值的类型、函数功能等。
实验步骤
1、
进入Visual
C++6.0
2、
创建一个空工程sy1
3、
创建area.c文件
4、
流程图
否
iRecv=recvfrom()
调用失败
输出调用失败
开始
确定端口号
输出服务器
WSAStartup
sListen=Socket
Bind()
是
是
是
否
否
否
否
1
isend=sendto()
!=0
调用成功
Closesocket
(saccept)
Closesocket(saccept)
结束
==0
!=0
输出接收到的数据、IP地址、端口号
==0
5、
编写代码
程序一:服务器端
#include
#include
#include
#define
DEFAULT_PORT
5050
#define
BUFFER_LENGTH
1024
#pragma
comment(lib,“WS2_32.lib“)
void
main()
{
int
iPort=DEFAULT_PORT;
WSADATA
wsaData;
SOCKET
sSocket;
int
iLen,iRecv,iSend;
struct
sockaddr_in
ser,cli;
char
send_buf[]=“Hollo!I
am
a
server“;
char
recv_buf[BUFFER_LENGTH];
printf(“--------------------“);
printf(“Server
waiting“);
printf(“--------------------“);
if(WSAStartup(MAKEWORD(2,2),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)
return;
}
iLen=sizeof(cli);
memset(recv_buf,0,sizeof(recv_buf));
while(1)
{
iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)
if(iRecv==SOCKET_ERROR)
{
printf(“recvfrom()函数调用失败:\n“,WSAGetLastError());
break;
}
else
if(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*)
if(iSend==SOCKET_ERROR)
{
printf(“sendto()函数调用失败:\n“,WSAGetLastError());
break;
}
else
if(iSend==0)
break;
else
{
printf(“sendto():调用成功!\n“);
}
}
closesocket(sSocket);
WSACleanup();
}
流程图二:
结束
提示输入地址
否
输出调用失败
开始
带参main()定义变量
WSAStartup
Socket()
Recvfrom()
sendto()
是
是
是
是
是
否
否
否
否
WSAcleanup()
Closesocket()
Largc<2
接收数据初始化缓冲区
程序二:客户机端程序
#include
#include
#include
#define
DEFAULT_PORT
5050
#define
DATA_BUFFER
1024
#pragma
comment(lib,“WS2_32.lib“)
void
main(int
argc,char*
argv[])
{
WSADATA
wsaData;
SOCKET
sClient;
int
iPort=5050;
int
iLen;
int
isend,iRecv;
char
send_buf[]=“Hello!
I
am
a
client“;
char
recv_buf[DATA_BUFFER];
struct
sockaddr_in
ser;
if(argc<2)
{
printf(“输入服务器的IP地址:\n“);
return;
}
else
memset(recv_buf,0,sizeof(recv_buf));
if(WSAStartup(MAKEWORD(2,2),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,(struct
sockaddr*)
if(isend==SOCKET_ERROR)
{
printf(“sendto()函数调用失败:%d\n“,WSAGetLastError());
return;
}
else
if(isend==0)
return;
else
printf(“sendto()调用成功:\n“);
iRecv=recvfrom(sClient,recv_buf,sizeof(recv_buf),0,(struct
sockaddr*)
if(iRecv==SOCKET_ERROR)
{
printf(“recvfrom()函数调用失败:%d\n“,WSAGetLastError());
return;
}
else
if(iRecv==0)
return;
else
{
printf(“sendto():%s\n“,recv_buf);
printf(“-------------------------------\n“);
}
closesocket(sClient);
WSACleanup();
}
6、编译程序
7、查看运行
8、出错分析
实验总结
1.
函数功能是:完成Winsock服务的初始化,从而可以在应用程序当中调用任何一个Winsock
API函数;
2.
函数调用成功时返回0
3.
应用程序只能在一次成功的WSAStartup()调用之后才能进一步调用其它函数;
实验心得
完成此次的实验报告单后我的感受有:
1、
对学过的知识不能够真正理解。
2、
对学过的理论知识不能在实际问题中学以致用。
3、
对循环语句的逻辑思维不理解。
4、
对一些语句的使用语法模糊不清。不能正确的用了流程图来反映其代码的含义及其做题思路。