원격 호스트에서 UDP 데이터를받는 C# 응용 프로그램이 있습니다. 나는 때로는 내 소켓이 아무것도받지 못한다는 것을 알았고 나는 왜 그런지 전혀 알지 못한다! Wireshark는 내 데이터가 원격 장치에서 올바르게 전송되고 있다고 알려줍니다. 나는 때로는 내가 잘받을 수있는 이유를 얻는 것 같지 않으며 때로는 할 수 없다.UDP가 때때로 어떤 것도받을 수 없습니다.
나는 예외를하지 않지만, 경우에 내 코드가 도움이됩니다 OnRecieve 여기
라는 결코 극복 :
class cUdpRx
{
private Thread rxThread = null;
private Socket UdpSocket;
private IPEndPoint localEp;
byte[] byData;
//rxbytes event
public delegate void OnRxBytesEventHandler(byte[] rxBuf);
public event OnRxBytesEventHandler OnRxBytesEvent;
/// <summary>
/// Creates the udp socket
/// </summary>
/// <param name="Port"></param>
/// <returns></returns>
public bool CreateSocket(int Port)
{
try
{
byData = new byte[1500]; //create our buffer
UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
UdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
localEp = new IPEndPoint(IPAddress.Any,Port);
UdpSocket.Bind(localEp);
UdpSocket.BeginReceive(byData,0,byData.Length, SocketFlags.None, new AsyncCallback(OnRecieve), UdpSocket);
return true; //seemed to work ok
}
catch
{
Dispose();
return false; //something went wrong, abort
}
}
private void OnRecieve(IAsyncResult iar)
{
byte[] rxData;
int nBytesRec = 0;
Socket socket = (Socket)iar.AsyncState;
try //in case something else has already disposed of the socket
{
nBytesRec = socket.EndReceive(iar);
}
catch
{
Debug.WriteLine("cant access udp rx socket");
}
try
{
if (nBytesRec > 0)
{
rxData = new byte[nBytesRec];
Array.Copy(byData, rxData, nBytesRec); //copy exact data into new array
OnRxBytesEvent(rxData);
}
if(!killThreads)
UdpSocket.BeginReceive(byData, 0, byData.Length, SocketFlags.None, new AsyncCallback(OnRecieve), UdpSocket);
}
catch(SocketException se)
{
Debug.WriteLine(se.ToString());
}
}
어떤 도움이 정말 그 앞으로가는 나 중지로 감상 할 수있다
내 프로젝트와. 감사합니다
업데이트 그것은 IPAdress.any를 사용하는 것 같습니다. 내가 변경하는 경우 :
localEp = new IPEndPoint(IPAddress.Any,Port);
192.168.0.33 내 컴퓨터의 IP 주소입니다
localEp = new IPEndPoint(IPAddress.Parse("192.168.0.33"),Port);
에, 그것은 데이터마다 시간을받습니다. 누구나 이유를 설명 할 수 있습니까? IPAddress.any를 사용하고 무선 및 유선 연결에서 수신하는 것이 매우 유용합니다. IPAddress.any는 0.0.0.0과 같으며 MSDN에 따르면 모든 네트워크 인터페이스에서 수신해야합니다.
UDP는 TCP처럼 패킷이 도착한다고 보장하지 않습니다. 흔들린 연결의 효과를 볼 수도 있습니다. – Dervall
wireshark가 패킷을보고 있다면 적어도 NIC가 패킷을 수신한다는 의미입니다. 나도 데이터를 잘 받거나 전혀받지 못한다. 또한 OnRecieve에서 두 번의 try/catch를 사용하는 것이 이상하게 보일 수 있다고 덧붙이고 싶습니다. 그러나 나는 그 시간에 디버깅을하고 있었으므로 무시하려고했습니다. – gcb