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

  显示原文与译文双语对照的内容
0 0

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

我正在构建一个系统接口,它发送一个 36-byte'通知'数据包,并期望 36-byte'确认'数据包。

36-byte 负载是一个十六进制字符串( 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 matchn"; }

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

我在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

谁能对这发生的原因 shed?

时间: 原作者:

0 0

这种情况发生是因为 tcp/udp校验和卸载到网卡。 有关更详细的信息,请参见命令,以便禁用这里选项,这将抑制错误。

原作者:
...