저는 현재 이더넷을 통해 UDP 통신 PC <-> ARM LM3S6965 (Luminary)에서 작업하고 있습니다. PC에는 UDP 서버 / 클라이언트를 시뮬레이션하는 VB.net 애플리케이션이 있습니다.
패킷이 PC에서 ARM LM3S6965로 전송되면 패킷이 오류없이 수신되지만 ARM LM3S6965가 UDP 패킷을 PC로 다시 전송하면 패킷이 어딘가에서 손실됩니다 (애플리케이션에서 수신하지 않음).
이상한 점은 WireShark가 PC로 들어오는 이러한 패킷을 캡처하고 유효한 것으로 보인다는 것입니다.
Windows에서 방화벽을 꺼도 도움이되지 않았습니다. 이 주제가이 포럼에 잘못되었을 수 있다는 것을 알고 있지만 WireShark가 이러한 패킷을 캡처하는 이유를 설명 할 수있는 사람이 있지만 내 응용 프로그램은 그렇지 않습니다. ARM LM3S6965 (192.168.0.100), PC (192.168.0.116), 송수신은 포트 번호 3040을 통해 이루어지며, ARM LM3S6965 마이크로 컨트롤러에서 수신 한 VB.Net 애플리케이션에서 브로드 캐스트 메시지를 보내고 있습니다.
다음은 VB.net 코드입니다.
Public Const mnPort As Int16 = 3040 'Port number to send/recieve data on
Public Const msBroadcastAddress As String = "255.255.255.255" 'Sends data to all LOCAL listening clients, to send data over WAN you'll need to enter a public (external) IP address of the other client
Public udpReceivingClient As UdpClient 'Client for handling incoming data
Public udpSendingClient As UdpClient 'Client for sending data
Public receivingThread As Thread 'Create a separate thread to listen for incoming data, helps to prevent the form from freezing up
Public mbiClosing As Boolean = False 'Used to close clients if form is closing
Public Sub InitializeSender()
udpSendingClient = New UdpClient(msBroadcastAddress, mnPort)
udpSendingClient.EnableBroadcast = True
End Sub
Public Sub InitializeReceiver()
udpReceivingClient = New UdpClient(mnPort)
'Dim start As ThreadStart = New ThreadStart(AddressOf MT_Receiver)
'receivingThread = New Thread(start)
'receivingThread.IsBackground = True
'receivingThread.Start()
End Sub
Public Sub MT_Send_UDP(ByVal lbTxBuffer() As Byte)
Try
udpSendingClient.Send(lbTxBuffer, lbTxBuffer.Length)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Try
udpReceivingClient.BeginReceive(AddressOf MT_RX_Callback, Nothing)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Public Sub MT_RX_Callback(ByVal IR As IAsyncResult)
Dim endPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 3040)
Dim lbData() As Byte
Dim llRet As UInt16
If mbiClosing = False Then
llRet = udpReceivingClient.Available
lbData = udpReceivingClient.EndReceive(IR, endPoint)
If llRet > 0 Then
MT_Validate_Msg(lbData)
End If
udpReceivingClient.BeginReceive(AddressOf MT_RX_Callback, Nothing)
End If
End Sub
Private Sub frmSearchUDP_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
mbiClosing = True
udpReceivingClient.Close()
udpSendingClient.Close()
frmMain.Timer.Enabled = True
End Sub
Private Sub frmSearchUDP_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
InitializeSender()
InitializeReceiver()
End Sub
더 많은 댓글이지만 너무 깁니다 ...
No196 : 42.430628
From 192.168.0.168-> 255.255.255.255 (PC에서 하드웨어로)
UDP ... 소스 포트 : 63162 (63162)
대상 포트 : tomato-springs (3040)
이것은보기에 좋고 하드웨어가 응답을 보내기 때문에 분명히 작동합니다.
No197 : 42.431017
From 192.168.0.100-> 255.255.255.255 (하드웨어에서 PC로)
소스 포트 : 토마토 스프링 (3040)
대상 포트 : 63162 (63162)
PC에서이 패킷을 받아야하는 이유는 무엇입니까?
대상 포트는 63162이지만 포트 3040을 수신합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다