PHP套接字 - socket_sendto() - UDP标头不匹配

时间:2013-06-19 21:49:11

标签: sockets udp php

遇到问题我无法解释。

我正在构建一个发送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

有人能说清楚为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

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