在两台PC上,我正在打开一个AF_PACKET / PF_PACKET套接字,原始协议。
sock =套接字(AF_PACKET,SOCK_RAW,hton(PROTO_BULK))
(编辑: PROTO_BULK是一个虚拟类型,由我自己为这个测试创建。我不认为这是与这个问题有关,但我可能错了。)
第一台PC以标准的send()方式向另一方发送数据包,在另一侧接收该数据包时:
recvfrom(sock,buffer,1600,0,( sockaddr*) &from,&fromlen);
我现在的问题是:"from“中的数据类型是什么?下面是我所收到的一个例子:
00 00 00 f8 a1 00 58 1d a1 00 94 60
从长度和内容来看,它既不像“sockaddr”,也不像"sockaddr_ll“。有什么想法吗?
我实际上是在寻找数据包被接收到的接口。我可以使用来自数据包的目标MAC并从它识别接口,但是它不能与广播数据包一起工作。
我正在运行一个最近的Linux内核(我不想研究内核源代码!)。
编辑:,我的代码错了。我没有用"from“缓冲区大小初始化”from did“,所以我假设存在一些伪值,而且"recvfrom()”不能正确地完成它的工作。感谢below为我指出了这个错误,他的评论如下!当然,我的问题中没有包括错误代码的这一部分,因为很明显,这样简单的代码不会有任何错误。
使用正确的参数,我得到一个"struct sockaddr_ll“正确填充,包括我正在寻找的接口编号。
发布于 2011-05-26 16:18:45
,我实际上是在寻找数据包被接收到的接口。
您应该使用recvmsg,它允许访问元数据,例如数据包的目标地址(对于多主机系统很有用),我认为接口也是如此。
你现在看到的发件人地址不会告诉你界面。不过,它可以用sendto发送回复包。
发布于 2011-05-26 15:32:43
我看了一下内核源代码。我并不完全理解他们,但是.
是PROTO_BULK 37984 (0x9460)吗?
如果是这样的话,这可能是一个"struct sockaddr_pkt“。(无论如何,它的尺寸是对的。)虽然我不知道其他字节是什么意思。如果我正确地读取了代码,它们应该是接收数据包的接口的“名称”。所以我可能读错了代码。
https://stackoverflow.com/questions/6140867
复制相似问题