2013-06-19 43 views
1

遇到問題我無法解釋。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 

任何人都可以提供一些線索,以爲什麼發生這種情況?

+0

您的系統可能已將校驗和卸載到NIC。 – Barmar

回答

0

發生這種情況是因爲關閉TCP/UDP校驗和卸載到NIC。有關更多詳細信息,請參閱this page,以及可用於禁用此選項的命令,這將抑制錯誤。

+0

謝謝。爲了弄清楚這一點,我耗盡了我的資源。多謝。 :-) – Marc

+0

當我搜索「tcpdump bad udp cksum」時,該頁面是第一個打開的頁面。 Google不是您的資源之一? – Barmar

+0

你有權對此表示嗤之以鼻。我正在尋找所有這一切都是我使用php的問題。也許最好說它已經耗盡了我的理智。 – Marc