UDP通信程序调试报告

上传人:tia****nde 文档编号:36843983 上传时间:2018-04-03 格式:DOC 页数:7 大小:137KB
返回 下载 相关 举报
UDP通信程序调试报告_第1页
第1页 / 共7页
UDP通信程序调试报告_第2页
第2页 / 共7页
UDP通信程序调试报告_第3页
第3页 / 共7页
UDP通信程序调试报告_第4页
第4页 / 共7页
UDP通信程序调试报告_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《UDP通信程序调试报告》由会员分享,可在线阅读,更多相关《UDP通信程序调试报告(7页珍藏版)》请在金锄头文库上搜索。

1、UDP 通信实验调试报告通信实验调试报告 一、调试内容:调试内容: 使用 VC6.0 作为开发平台,采用 C 语言编写 udp 程序,实现两台 PC 机通过以太网口传输数据。两台 PC 机,一台运行开发程序,一台运行通信调试用端口精灵 WizPort 以太网口监视器作为程序调试辅助工具。二、程序流程程序流程 使用 UDP 通信程序运行步骤: 预先设置本机和目标机的 IP 地址和端口号 创建本机上的套接字 socket 将套接字与本机的 IP 地址和端口号绑定 检测套接字设备文件的读写状态,接收和发送数据三、程序代码简析程序代码简析 用用 Compaq Visual Fortran 6 编译器可

2、以调试程序编译器可以调试程序 #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(如

3、上图) 。“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 地址和端口号。端口号设置在 10244096 之间。 WSADATA wsadata; WSAStartup(0x101, 先定义一个 WSADATA 结构指针,用于记录 windows 套接字的

4、相关信息。WSADATA 如下: TypedefstructWSADataWORD wVersion;/调用者使用的 WS2_32D.LL 的版本号WORD wHighVerion;/表示 WS2_32D.LL 支持的最高版本 charszDescriptionWSADESCRIPTION_LEN+1; charszSystemStatusWSASYS_STATUS_LEN+1;unsigned shortiMaxSockets;/表示最多可以打开多少套接字unsigned short IMaxUdpDg;/表示数据报的最大长度 char FAR* lpVendorInfro;/套接字厂商信息

5、 WSADATA使用 Socket 的程序在使用 Socket 之前必须调用 WSAStartup 函数。该函数的第一个参数指明程序请求使用的Socket 版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的 Socket 的版本信息。当一个应用程序调用 WSAStartup 函数时,操作系统根据请求的 Socket 版本来搜索相应的 Socket 库,然后绑定找到的 Socket 库到该应用程序中。以后应用程序就可以调用所请求的 Socket 库中的其它 Socket 函数了。该函数执行成功后返回 0。对各终端的对各终端的 IP 地址结构设置地址结构设置 定义当

6、地和目标套接字地址结构,指定使用的地址家族即地址格式,端口号码,IP 地址。套接字地址 结构用于解决 TCP/IP 寻址。 套接字结构体类型的定义: structsockaddr_in short sin_family; /指定地址家族即地址格式 u_shortsin_port; /端口号码 structin_addrsin_addr; /IP 地址char sin_zero8; /留作备用,需要指定为 0我们用 0 来填充 sin_zero 数组,目的是让 sockaddr_in结构的大小与 sockaddr 结构的大小一致。 ;其中,结构体类型 in_addr 的定义如下: structi

7、n_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_P

8、ORT);/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 errorn“); err_exit(); 对本机机 IP 地址结构体的赋值和目标机的方法相同,只是参数不一样。创建创建 udp 套接字套接字SOCKET soc

9、ket(intaf,int type,int protocol)应用程序调用 socket 函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于 TCP/IP 协议族,该参数置 PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为 SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议。该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回 INVALID_SOCKET(-1)。创建套接字使用的函数 socket(AF_INET,SOCK_DGRAM,0)。类型为 int 的 udp_fd

10、 是在主函数入口处定义的套接字句柄即套接字 描述符变量。 if(udp_fd = socket(AF_INET,SOCK_DGRAM,0) 0) printf(“udp socket errorn“); err_exit();/创建失败就退出 将本机套接字绑定到指定的端口和地址上将本机套接字绑定到指定的端口和地址上 int bind(SOCKET s,conststructsockaddr FAR *name,intnamelen)当创建了一个 Socket 以后,套接字数据结构中有一个默认的 IP 地址和默认的端口号。一个服务程序必 须调用 bind 函数来给其绑定一个 IP 地址和一个特定

11、的端口号。户程序一般不必调用 bind 函数来为其 Socket 绑定 IP 地址和端口号。该函数的第一个参数指定待绑定的 Socket 描述符;第二个参数指定一个 sockaddr 结构;第三个参数表示绑定的套接字数据结构长度。 if(bind(udp_fd , (structsockaddr *)err_exit();/退出 数据发送与接收循环数据发送与接收循环 void do_communicate(intfd)函数其中的形参 fd 是调用时传递来的 socket 句柄。 循环过程使用到文件描述符的处理。 1、先定义两个用于可读和可写检测的文件描述符集,并将 socket 句柄加入这两个

12、集合 fd_setreadable,writeable;FD_ZERO(/将 readable 清零使集合中不含任何 fd FD_ZERO(/将 writeable 清零使集合中不含任何 fd FD_SET(fd,/将 socket 句柄 fd 加入 readable 集合 FD_SET(fd,/将 socket 句柄 fd 加入 readable 集合2、程序使用 slect()函数检查套接口的 状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。select()调用返回处于就 绪状态并且已经包含在 fd_set 结构中的描述字总数;如果超时则返回 0;否则的话,返回 SOC

13、KET_ERROR 错误,应用程序可通过 WSAGetLastError 获取相应错误代码。 当返回位-1 时,所有描述符集清 0。 当返回为 0 时,超时不修改任何描述符集。 当返回为非 0 时,在 3 个描述符集里,依旧是 1 的位就是准备好的描述符。这时要用 FD_ISSET ()函数 来检测 fd 在 fdset 集合中的状态是否变化并返回整型,当检测到 fd 状态发生变化时返回真,否则,返 回假(0) ret = select(fd+1, if(ret = SOCKET_ERROR)/-1 错误,程序退出 printf(“select errorn“); closesocket(fd

14、); err_exit(); if(FD_ISSET(fd, &readable)/socket 的可读性检查及读取和打印操作 Mif(FD_ISSET(fd, &writeable)/socket 的可写性检查及发送操作 M三、与端口精灵的通信测试与端口精灵的通信测试测试结果: 一端运行程序,另一端运行调试助手进行测试如下: 2)运行端口精灵侧:本机 IP:10.1.19.198注意:发送数据的显示:查看显示方式ASII 码对端程序运行后,即接收到 20 个字符1点击工具以太网定时发送再次点击工具以太网定时发送,则取消发送3)运行程序侧:本机 IP:10.1.19.199程序中的 IP 地址如下: #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 3008 /源端的端口号程序开始运行,即向对端连续发送 20 个字符1 ;发送数据时本机无显示接收到数据时显示 ASCII 码:上述运行结果稳定!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号