Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets PHP套接字-套接字_sendto()-UDP标头不匹配_Sockets_Udp_Php - Fatal编程技术网

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

Sockets PHP套接字-套接字_sendto()-UDP标头不匹配,sockets,udp,php,Sockets,Udp,Php,遇到了一个我无法解释的问题 我正在构建一个系统接口,该系统发送一个36字节的“通知”数据包,并需要一个36字节的“确认”数据包 36字节的有效负载是一个十六进制字符串(72个字符),我使用bin2hex()对其进行“解包”,解析出需要更改的值,然后使用pack()重新打包 当我使用socket\u sendto()时,tcpdump显示我的传出数据包具有错误的UDP校验和 下面是我正在使用的代码示例。这只是将第一个数据包的有效负载转换为十六进制字符串 <?php $socket

遇到了一个我无法解释的问题

我正在构建一个系统接口,该系统发送一个36字节的“通知”数据包,并需要一个36字节的“确认”数据包

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

当我使用
socket\u 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";
    }

有人能解释一下为什么会发生这种情况吗?

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

您的系统可能已将校验和卸载到NIC。谢谢。我已经用尽了我的资源来解决这个问题。非常感谢。:-)当我在谷歌上搜索“tcpdump bad udp cksum”时,该页面是第一个热门页面。谷歌不是你的资源之一?你有权对此大惊小怪。我正在搜索所有内容,因为这是我如何使用php的一个问题。也许最好说这已经耗尽了我的理智。
(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