实验二UDP通信实验.docx
- 文档编号:30069987
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:7
- 大小:53.11KB
实验二UDP通信实验.docx
《实验二UDP通信实验.docx》由会员分享,可在线阅读,更多相关《实验二UDP通信实验.docx(7页珍藏版)》请在冰豆网上搜索。
实验二UDP通信实验
网络程序设计
实验报告
实验名称:
UDP通信实验
指导教师:
贾浩
专业班级:
姓 名:
学 号:
实验地点:
实验日期:
实验成绩:
________________
1、实验目的
●进一步理解Winsock编程接口的调用方法。
●了解UDP协议的工作原理,掌握UDP服务端程序和客户端程序的编写过程,熟悉程序的测试方法
2、实验设计
1、服务端和客户端相关API函数
1)创建套接字函数socket()
SOCKETsocket(intaf,inttype,intprotocol);
由于采用数据报套接字进行数据传输,因此type参数必须设置为 SOCK_DGRAM,protocol参数必须设置为IPPROTO_UDP
2)绑定本地地址到所创建的套接字函数bind()
intbind(SOCKETs,conststructsockaddr*name,intnamelen);
在实际编程时可以省略该函数,系统会自动绑定
3)接收数据函数recvfrom()
intrecvfrom(SOCKETs,char*buf,intlen,intflags,
structsockaddr*from,int*fromlen);
4)发送数据函数sendto()
intsendto(SOCKETs,constchar*buf,intlen,intflags,
conststructsockaddr*to,int*tolen);
5)关闭套接字函数closesocket()
intclosesocket(SOCKETs);
2、数据报套接字编程模型时序和流程
三、实验过程
1.调试实验带的代码,使之能运行。
2.修改代码使服务端和客户端能互发信息,并能正确接受到。
3.进一步修改代码,当任何一方发送字符“bye” 程序就结束
错误
1.客户端的字符比较函数放错位置了,本来是放在接受函数之后,我没注意放在了发 送函数之后,所以客户端发送了BYE之后,客户端并不能结束程序。
4、讨论与分析
1.能否在接收数据之间不进行bind()调用?
如果能,请说明可能的情况。
答:
能,首先调用的是Sendto函数,系统会自动为程序绑定。
因此即便调用recvfrom也可以。
2.能否使用connect()连接对方?
为什么?
答:
能客户创建套接字即可调用connect()连接对方服务器监听套接字,当服务器端的accept函数返回后,connect函数也返回。
此时客户端使用Socket函数创建的套接字,服务器使用accept函数创建的套接字,双方就可以通讯了。
5、实验者自评
这次实验比较简单,运行的时候要先运行服务端,再运行客户端。
按照实验要求当任何一方发送字符“bye” 程序就结束,因此服务端在接受数据函数后加上字符比较函数strcmp(),客户端也同样处理。
实验结束基本上理解UDP通信的过程。
6、附录:
关键代码
1、//UDP.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
#include
#pragmacomment(lib,"ws2_32.lib")
#include
#include
//CInitSockinitSock;
#defineBUF_SIZE 64
intmain()
{
//创建套节字
WSADATAwsd;
//SOCKETsServer;
//SOCKETsCient;
//intretVal;
//charbuf[BUF_SIZE];
WSAStartup(MAKEWORD(2,2),&wsd);
SOCKETs=:
:
socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s==INVALID_SOCKET)
{
printf("Failedsocket()\n");
return0;
}
//填充sockaddr_in结构
sockaddr_insin;
sin.sin_family=AF_INET;
sin.sin_port=htons(4567);
sin.sin_addr.S_un.S_addr=INADDR_ANY;
//绑定这个套节字到一个本地地址
if(:
:
bind(s,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("Failedbind()\n");
return0;
}
//接收数据
charbuff[1024];
sockaddr_inaddr;
intnLen=sizeof(addr);
while(TRUE)
{
intnRecv=:
:
recvfrom(s,buff,1024,0,(sockaddr*)&addr,&nLen);
if(nRecv>0)
{
buff[nRecv]='\0';
printf("接收到数据(%s):
%s",:
:
inet_ntoa(addr.sin_addr),buff);
}
}
:
:
closesocket(s);
}
2、//UDPClient.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
#include
//CInitSockinitSock; //初始化Winsock库
#defineBUF_SIZE 64
intmain()
{
//创建套节字
WSADATAwsd;
//SOCKETs
WSAStartup(MAKEWORD(2,2),&wsd);
SOCKETs=:
:
socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s==INVALID_SOCKET)
{
printf("Failedsocket()%d\n",:
:
WSAGetLastError());
return0;
}
//也可以在这里调用bind函数绑定一个本地地址
//否则系统将会自动安排
//填写远程地址信息
sockaddr_inaddr;
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
//注意,这里要填写服务器程序所在机器的IP地址
//如果你的计算机没有联网,直接使用127.0.0.1即可
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
//发送数据
charszText[]="TCPServerDemo!
\r\n";
:
:
sendto(s,szText,strlen(szText),0,(sockaddr*)&addr,sizeof(addr));
:
:
closesocket(s);
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 UDP 通信