2011-12-09 44 views
2

我正在使用AutoIt的标准UDP函数。我测试并转储UDP数据包到回送接口127.0.0.1(向我自己发送udp数据包)。我用RawCap捕获它,然后在Wireshark中打开。它告诉我头标校验和有问题。为什么? 我可以以某种方式封装UDP内的HTTP(使用AutoIt)吗?为什么在AutoIt UDP协议中有头校验错误?

enter image description here

#include <GUIConstantsEx.au3> 
#include <WindowsConstants.au3> 
#include <ButtonConstants.au3> 
HotKeySet("{esc}", "Cleanup") 
HotKeySet("{enter}", "sendData") 
Global $ConnectedSocket = -1 
Global $MainSocket 
Local $g_IP, $RogueSocket, $GOOEY, $edit, $input, $butt, $msg 
Local $ret, $recv 
$g_IP = "127.0.0.1" 
$_INCOMING_FLAG = "UDP DATA: " 
OnAutoItExitRegister ("Cleanup") 


; 1. UDP Listener ### Start The UDP Services ### 
;============================================== 
UDPStartup() 
OnAutoItExitRegister ("Cleanup") 

; 1. UDP Listener ### Create a Listening "SOCKET" 
;============================================== 
$socket = UDPBind($g_IP, 65432) 
If @error <> 0 Then Exit 

; 3. GUI ### Create a GUI for chatting 
;============================================== 
$GOOEY = GUICreate("P2P Chat", 300, 200) 
$edit = GUICtrlCreateEdit("", 10, 40, 280, 150, $WS_DISABLED) 
$input = GUICtrlCreateInput("", 10, 10, 200, 20) 
$butt = GUICtrlCreateButton("Send", 210, 10, 80, 20, $BS_DEFPUSHBUTTON) 
GUISetState() 

; GUI Message Loop 
;============================================== 
While 1 
    $msg = GUIGetMsg() 
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop 

    If $msg = $butt Then sendData() 

    $data = UDPRecv($socket, 200) 
    If $data <> "" Then 
     GUICtrlSetData($edit, GUICtrlRead($edit) & $_INCOMING_FLAG &$data & @CRLF) 
    EndIf 
;~ Sleep(50) 

WEnd 
GUIDelete($GOOEY) 

Func sendData() 
    If $socket <> 0 Then 
     $status = UDPSend($socket, GUICtrlRead($input)) 
     If $status = 0 Then 
      MsgBox(0, "ERROR", "Error while sending UDP message: " & @error) 
      Exit 
     EndIf 

    ElseIf $ret > 0 Then 
     ; UPDATE EDIT CONTROL WITH DATA WE SENT 
     ;---------------------------------------------------------------- 
     GUICtrlSetData($edit, GUICtrlRead($edit) & GUICtrlRead($input) & @CRLF) 
     GUICtrlSetData($input, "") 
    EndIf 
EndFunc ;==>sendData 


Func Lookup() 
    ; If no connection look for one 
    Return 0 
EndFunc ;==>Lookup 

Func Cleanup() 
    UDPCloseSocket($socket) 
    UDPShutdown() 
EndFunc ;==>Cleanup 
+1

我无法重现您的答案。如果你可以提供更多关于如何复制的细节,也许我可以。始终可以通过UDP发送HTTP数据包,但从技术上讲,它只会与HTTP类似,因为它定义为通过TCP。 –

+1

UDP数据包可能会丢失,并且UDP不是真正可靠的,有时数据发生损坏,与TCP不同,您将不得不重新发送相同的UDP数据包,直到它恢复正确。但是,从这种缺点您可以获得很多速度。当发生低UDP数据包丢失时,您将绕过所有安全性。 – SSpoke

回答

1

我猜所有的错误的校验和是0x0000;在这种情况下,您可能会遇到TCP Checksum Offloading。这是试图让网络硬件计算校验和的操作系统(这将减少CPU上的负载)。这些校验和在您的应用程序中不是错误。