2013-06-19 20 views
1

遇到问题我无法解释。PHP套接字 - socket_sendto() - UDP头不匹配

我正在建立一个系统的接口,发送一个36字节的'通知'数据包,并期待一个36字节'确认'数据包。

36字节有效负载是一个十六进制字符串(72个字符),我用bin2hex()解包出去,解析出需要更改的值,然后使用pack()重新打包。

当我使用socket_sendto()时,tcpdump显示我的传出数据包具有错误的UDP校验和。

下面是我使用的代码示例。这只是将第一个数据包的有效载荷送入一个十六进制字符串,

<?php 

    $socket  = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
    $local_host = '<source ip>'; 
    $local_port = '5858'; 
    $remote_host = ''; 
    $remote_port = ''; 

    socket_bind($socket, $local_host, $local_port) or die('Could not bind to address'); 

    echo "running...\n"; 

    while(true) 
    { 
     socket_recvfrom($socket, $input_buffer, 64, 0, $remote_host, $remote_port); 

     $hex_string = bin2hex($input_buffer); 

     // assume that I'd parse and modify $hex_string here. 
     // for this post, I'm just going to repack the same string. 

     $new_packet = pack("H*", $hex_string); 
     if($input_buffer === $new_packet) { echo "inbound/outbound contents match\n"; } 

     $socket2 = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
     socket_sendto($socket2, $new_packet, strlen($new_packet), 0, $remote_host, $local_port); 
     echo "sent\n\n"; 
    } 

什么我得到了tcpdump输出...

(remote ip).1144 > (local ip).5858: [udp sum ok] UDP, length 36 
(local ip).35572 > (remote ip).5858: [bad udp cksum 0x37a1 -> 0xaf02!] UDP, length 36 

任何人都可以提供一些线索,以为什么发生这种情况?

+0

您的系统可能已将校验和卸载到NIC。 – Barmar

回答

0

发生这种情况是因为关闭TCP/UDP校验和卸载到NIC。有关更多详细信息,请参阅this page,以及可用于禁用此选项的命令,这将抑制错误。

+0

谢谢。为了弄清楚这一点,我耗尽了我的资源。多谢。 :-) – Marc

+0

当我搜索“tcpdump bad udp cksum”时,该页面是第一个打开的页面。 Google不是您的资源之一? – Barmar

+0

你有权对此表示嗤之以鼻。我正在寻找所有这一切都是我使用php的问题。也许最好说它已经耗尽了我的理智。 – Marc