UDP通信程序调试报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UDP 通信实验调试报告
一、调试内容:
使用VC6.0作为开发平台,采用C语言编写udp程序,实现两台PC机通过以太网口传输数据。两台PC机,一台运行开发程序,一台运行通信调试用端口精灵WizPort以太网口监视器作为程序调试辅助工具。
二、程序流程
使用UDP通信程序运行步骤:
①预先设置本机和目标机的IP地址和端口号
②创建本机上的套接字socket
③将套接字与本机的IP地址和端口号绑定
④检测套接字设备文件的读写状态,接收和发送数据
三、程序代码简析
用Compaq Visual Fortran 6编译器可以调试程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "nser.h"
Udp应用程序除了涉及到一般的C语言库函数,还涉及到window功能调用,套接字函数调用,所以在VC开发平台默认的工程连接库中加入ws2_32.lib。该库对应ws2_32.dll,提供了网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程。在工程-->设置-->连接选项卡下的工程选项中输入ws2_32.lib(如上图)。"nser.h"中定义了一些常用宏。
#define NTD_IPADDR "10.1.19.198"//ntd的ip地址
#define NTD_PORT 3006 //nt的端口号
#define LOCAL_IPADDR "10.1.19.199"//源端的ip地址
#define LOCAL_PORT 3007 //源端的端口号
以上定义了目标PC机和本地PC机的的IP地址和端口号。端口号设置在1024~4096之间。
WSADATA wsadata;
WSAStartup(0x101,&wsadata);
先定义一个WSADATA结构指针,用于记录windows套接字的相关信息。WSADATA如下:TypedefstructWSAData{
WORD wVersion;//调用者使用的WS2_32D.LL的版本号
WORD wHighVerion;//表示WS2_32D.LL支持的最高版本
charszDescription[WSADESCRIPTION_LEN+1];
charszSystemStatus[WSASYS_STATUS_LEN+1];
unsigned shortiMaxSockets;//表示最多可以打开多少套接字
unsigned short IMaxUdpDg;//表示数据报的最大长度
char FAR* lpVendorInfro;//套接字厂商信息
}WSADATA
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
对各终端的IP地址结构设置
定义当地和目标套接字地址结构,指定使用的地址家族即地址格式,端口号码,IP地址。套接字地址结构用于解决TCP/IP寻址。
套接字结构体类型的定义:
structsockaddr_in {
short sin_family; //指定地址家族即地址格式
u_shortsin_port; //端口号码
structin_addrsin_addr; //IP地址
char sin_zero[8]; //留作备用,需要指定为0我们用0来填充sin_zero数组,目的是让sockaddr_in 结构的大小与sockaddr结构的大小一致。
};
其中,结构体类型in_addr的定义如下:
structin_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_longS_addr;//使用此变量进行描述IP地址
}
定义本机和目标机的套接字地址结构体:
structsockaddr_inntd_ip;
structsockaddr_inlocal_ip;
下面是对目标机IP地址结构体的赋值:
ntd_ip.sin_family=AF_INET;//指定程序所使用的地址家族是TCP/IP
ntd_ip.sin_port=htons((unsigned short)NTD_PORT);//htons()将端口号整数转换为大端模式的网络字节序
ntd_ip.sin_addr.s_addr=inet_addr(NTD_IPADDR);//把字符IP字符串转换为网络字节顺序排列的IP地址
if(ntd_ip.sin_addr.s_addr==INADDR_NONE) //若s_addr为0xffffffff,表示地址错
{ 误,打印ntd地址错误提示,退出程序
printf("ntdinet_addr error\n");
err_exit();
}
对本机机IP地址结构体的赋值和目标机的方法相同,只是参数不一样。
创建udp套接字