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