遇到問題我無法解釋。PHP套接字 - socket_sendto() - UDP頭不匹配
我正在建立一個系統的接口,發送一個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
任何人都可以提供一些線索,以爲什麼發生這種情況?
您的系統可能已將校驗和卸載到NIC。 – Barmar