title image


Smiley Socket.BeginReceiveFrom durch Send unterbrochen?
Hallo,



ich versuche mit Hilfe eines Sockets eingehende UDP-Pakete zu empfangen. Da das Ganze möglichst performant und asynchron laufen soll benutze ich die BeginReceiveFrom-Methode. Das Problem liegt darin, dass ein Aufruf der Send, SendTo oder BeginSendTo Methode die Callback-Methode des BeginReceiveFroms auslöst.



Hier der Code:





using System;

using System.Net;

using System.Net.Sockets;

using System.Threading;



namespace SocketTest

{

class StateObject {

public Socket workSocket; // Socket;

public const int BufferSize = 1024; // Size of receive buffer.

public byte[] buffer = new byte[BufferSize]; // Receive buffer.

public EndPoint remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 0)); // Remote EP.

}





class SocketTest

{

public static void Main(string[] args)

{

Console.WriteLine("Hello World!");



SocketTest st = new SocketTest();



IPEndPoint localEP = new IPEndPoint(IPAddress.Parse("192.168.0.106"), 1001);

Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

udpSocket.Bind(localEP);



StateObject state = new StateObject();

state.workSocket = udpSocket;

udpSocket.BeginReceiveFrom(state.buffer,

0,

StateObject.BufferSize,

SocketFlags.None,

ref state.remoteEP,

new System.AsyncCallback(OnReceive),

state);



Thread.Sleep(2000);



udpSocket.SendTo(System.Text.Encoding.ASCII.GetBytes("hallo"), new IPEndPoint(Dns.GetHostByName(Dns.GetHostName()).AddressList[0], 1002));



Thread.Sleep(2000);



udpSocket.Close();

}



public void OnReceive(IAsyncResult ar) {

Console.WriteLine("entered OnReceive");



StateObject state = (StateObject) ar.AsyncState;



int bytesRead = state.workSocket.EndReceiveFrom(ar, ref state.remoteEP);

Console.WriteLine("OnReceive: " + bytesRead.ToString() + " bytes read");

}

}

}







Wenn ich das Programm starte und ihm ein UDP-Paket zuschicke bevor SendTo aufgerufen wird, verläuft alles normal und erzeugt folgende Ausgabe:

Hello World!

entered OnReceive

OnReceive: 2 bytes read



wird aber die SendTo-Methode aufgerufen passiert das:

Hello World!

entered OnReceive



Unhandled Exception: System.Net.Sockets.SocketException: Eine vorhandene Verbindung wurde vom Remotehost geschlossen

at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)

at SocketTest.SocketTest.OnReceive(IAsyncResult ar) in d:\Eigene Dateien\SharpDevelop Projects\SocketTest\Main.cs:line 61

at System.Net.Sockets.OverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)





Kann ich also nicht gleichzeitig auf Pakete warten und welche verschicken?



Wenn mir jemand helfen könnte, wäre ich sehr dankbar. Hinweise auf schlechten Style und oder anderen schlechten Code können auch nicht schaden, da ich mich noch nicht lang mit C# beschäftige.



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: