2011-12-09 2 views
2

AutoIt의 표준 UDP 기능을 사용하고 있습니다. 루프백 인터페이스 127.0.0.1에 UDP 패킷을 테스트하고 덤프했습니다 (직접 UDP 패킷을 보냅니다). RawCap으로 캡처 한 다음 Wireshark에서 열었습니다. 그것은 Header Check sum에 문제가 있음을 보여주었습니다. 왜? AutoIt을 사용하여 UDP 내부에 HTTP를 캡슐화 할 수 있습니까?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 패킷을 보낼 수있는 가능성은 항상 있지만, 기술적으로는 TCP를 거치는 것으로 정의되기 때문에 HTTP와 유사합니다. –

+1

UDP 패킷이 손실 될 수 있으며 UDP가 실제로 신뢰할 수없는 경우가 있습니다. 데이터가 TCP와 달리 손상된 경우가 있습니다. 다시 정상적으로 돌아올 때까지 동일한 UDP 패킷을 다시 보내야합니다. 그러나이 부분에서 속도가 훨씬 빨라집니다 . 낮은 UDP 패킷 손실이 발생하면 모든 보안을 우회합니다. – SSpoke

답변

1

나는 잘못된 체크섬 모든 0x0000을하는 것 같은데요; 이 경우 아마도 TCP Checksum Offloading으로 실행 중일 것입니다. 이것은 네트워크 하드웨어가 체크섬을 계산할 수있게하는 운영 체제입니다 (CPU 부하를 줄입니다). 이러한 체크섬은 응용 프로그램의 오류가 아닙니다.

관련 문제