为什么在UDP包中不能获取发包方的地址

首先,我们要先了解一下UDP包的结构。

                                  图1 UDP报文格式

从图1,我们可以看出,从UDP包中,我们可以获取的信息只有源端口和目的地端口。我们不能获取到源IP因为报文中没有源IP。真正包含IP地址的是IPV4伪报头中

                                   图2 UDP包的IPV4伪报头格式

可以看出,图1中的UDP包其实是包含在图2中的,图2中清楚地指出了包的源地址(source addresses)和目标地址(destination addresses)都在IPv4头中。图2的协议是UDP专用的(详见List of IP protocol numbers):17(0x11)。UDP length指的是UDP头(head)和数据(data)的长度。

再让我们通过抓包工具直观地看一下,见图3。

                                                      图3 抓包工具的截图

那么我们如何获取一个IP地址呢?

方法1、查看ARP表是最简单的方法。

方法2、使用libpcap是最可靠的。可以参考linux下网络监听与发送数据包的方法(即libpcap、libnet两种类库的使用方法)

方法3、写自己的网卡驱动,应该没几个人会这样搞。

 

 

参考链接

Getting the source hardware address of received UDP packets?

User Datagram Protocol

作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/3159781.html

时间: 2024-09-08 03:16:03

为什么在UDP包中不能获取发包方的地址的相关文章

LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取struct in_pktinfo(struct in_pktinfo是struct msghdr中msg_control的成员).in_pktinfo 结构体(如下所示),我们可以从in_pktinfo中获取路由目的地址(destination address of the packet).头标识

Java中如何获取用户mac地址?

问题描述 Java中如何获取用户mac地址? 在Java项目中如何用代码获取用户MAC地址,我用的是w7系统 解决方案 http://blog.163.com/09zzy@126/blog/static/71197665201001504753750/ 解决方案二: public static String getWindowsMACAddress() { String mac = null; BufferedReader bufferedReader = null; Process proce

Silverlight中动态获取Web Service地址_实用技巧

在使用WCF或者WS进行数据库操作的时候都需要有一个明确的服务地址,如果是WCF就是svc文件地址.初学者通常会直接使用VS的Add Service Reference来添加引用.这的确是十分方便的手段,但是这样会带来什么样的麻烦呢? 第一,在开发的阶段一旦改变了WS文件的目录结构就必须改变SL工程中的WS地址,而且这种改变并不是单纯的Update Service Reference这么简单,因为地址已经改变了,你必须删掉旧的Reference来添加新的Reference,这是其一. 第二, 当

教你如何获取ipa包中的开发文件

教你如何获取ipa包中的开发文件 1. 从iTunes获取到ipa包 2. 修改ipa包然后获取里面的开发文件

java-jar包中dll文件怎么获取?

问题描述 jar包中dll文件怎么获取? 在linux环境下,java生成的jar包,在运行jar包程序时怎么获取jar包中的资源呢? 解决方案 直接引用jar包里的包名.类名.方法名

用安卓中jython包开发了获取教务处课表的小程序,出错为NoClassDefFoundError

问题描述 用安卓中jython包开发了获取教务处课表的小程序,出错为NoClassDefFoundError 代码如下:public class CourseScrawler { public static int[][] getCourseArray(String stuID, String pwd) { PythonInterpreter interp = new PythonInterpreter(); interp.execfile("src/course-scrawler.py&quo

向了解VLC开发的求教:如何修改VLC源码中UDP包长度?

问题描述 向了解VLC开发的求教:如何修改VLC源码中UDP包长度? 大家好 我在官网上下载了VLC的源代码,版本vlc-2.2.0.我现在在服务器端通过VLC向客户端发送本地视频文件并播放该视频,客户端接收数据并通过VLC播放视频,!他们之间通过UDP的方式传输,现在想要更改服务器端发出的UDP包的长度,使之变小,请问在VLC源代码哪里更改,看见源代码里边那么多的模块,看了两天实在找不到头绪,请高手指教,不胜感激! 解决方案 http://blog.csdn.net/lvmaker/artic

FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题--转

FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题 算法暂不介绍. 思路:FEC ENCODE 增加冗余包,当无线等网络丢包之后,接收端使用冗余包可将丢失的包DECODE出来. 举例:10个包,编码后会增加2个包,共12个包发送到接收端,接收端丢失第5和第9包,仅靠剩下的10个包就可以解出第5和第9包. 结果就是,接收端接收到了完整的10个包,代价仅仅是增加了冗余和cpu编解码的消耗.   参考: 1. RTP抗丢包传输方案 点

Oracle中执行远端DBMS_LOB包中过程

简单描述执行远端的DBMS_LOB包的一些问题. 由于LOB的定位符无法跨数据库链使用,因此访问远端LOB对象的时候,需要调用远端的DBMS_LOB包中的过程,但是测试发现,即使调用远端的DBMS_LOB包中的过程,仍然可能出现问题. SQL> CREATE TABLE T_LOB (ID NUMBER, CONTENTS CLOB); 表已创建. SQL> DECLARE 2     V_LOB CLOB; 3  BEGIN 4     INSERT INTO T_LOB 5     VAL