sockets - PHP 套接字 - socket_sendto() - UDP header 不匹配

标签 sockets udp php

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

我正在为发送 36 字节“通知”数据包的系统构建一个接口(interface),并需要一个 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

任何人都可以解释为什么会这样吗?

最佳答案

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

关于sockets - PHP 套接字 - socket_sendto() - UDP header 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17201986/

相关文章:

c++ - 在 z/OS 上替换 C++ 中的 C 套接字 API

php - HTML 到经典 ASP - 页面加载为代码行 (ASP)

PHP 精确匹配一个字符串

python - 为什么我不能在 Python 中接收 UDP 数据包?

sockets - 如何保持连接以在不请求的情况下将实时数据发送到远程客户端

c# - 使用 System.Net.HttpListener 时有没有办法启用 SO_REUSEADDR 套接字选项?

c# - 发送或接收数据的请求被禁止,因为套接字未连接 - 发送数据时

java - UDP Android 应用程序适用于 HTC,但不适用于 Nexus S

c - 套接字编程 : sendto always fails with errno 22 (EINVAL)

php - 使用 Eloquent 执行查询时获取单个集合而不是数组