2016-05-27 4 views
0

Ich schreibe ein Programm, das Daten über UDP an einen bestimmten Server senden muss (was funktioniert) und auch Daten von diesem Server empfängt (was nicht funktioniert). Das Problem ist, dass der Port, an den ich Daten sende, nicht derselbe ist, von dem die Daten vom Server kommen.C# Empfangen über UDP

Server: Hört auf einem Port, erstellt neue Sockets (an verschiedenen Ports) für jeden Client, um Daten zu senden.

Ich habe den folgenden Code (Client-Seite):

socker = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint epLocal = new IPEndPoint(myIp, localPort); 
socket.Bind(epLocal); 
IPAddress ipAddressremote = IPAddress.Parse(remoteIp); 
remoteEP = new IPEndPoint(ipAddressremote, port); 
socket.Connect(remoteEP); 

byte[] buffer = new byte[1024]; 
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(MessageCallBack), buffer); 
socket.Send(someByteArray); 

Diese erfolgreich zu meinem Server-Anwendung verbindet und sendet die Daten es soll. Allerdings wird MessageCallBack nie genannt:

private void MessageCallBack(IAsyncResult iAsyncResult) 
{ 
byte[] receivedData = (byte[])iAsyncResult.AsyncState; 
ASCIIEncoding eEncoding = new ASCIIEncoding(); 
string receievedMessage = eEncoding.GetString(receivedData); 
handleMessage(receievedMessage); 

byte[] buffer = new byte[1024]; 
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(MessageCallBack), buffer); 
} 

ich glaube, das Problem ist, dass der Client-Socket noch an den Port auf dem Server verbunden ist, und akzeptiert nur Daten aus diesem Hafen, aber meines Wissens ist dies kein Problem bei der Verwendung von BeginReceive anstelle von BeginReceiveFrom.

+0

Warum muss der UDP-Server einen neuen Socket für jeden Client erstellen? – SergeyA

+0

Ich dachte, das ist der Weg zu gehen, wenn der Server Daten an mehrere Clients senden muss ... lieg ich da falsch? –

+0

Es gibt wirklich keinen Grund dafür. Single-Buchse wird gut funktionieren. – SergeyA

Antwort

0

Bei Verwendung von UDP können Sie die Methoden Send und BeginReceive nicht verwenden, da diese verbindungsorientiert (TCP) sind. Verwenden Sie stattdessen die Socket.SendTo und Socket.BeginReceiveFrom. Es sollte mit diesen Methoden arbeiten.

+0

Sie können * Send() 'und' BeginReceive() 'mit UDP verwenden, aber sie erfordern Der Socket wird an bestimmte IP/Port-Paare gebunden, egal ob TCP oder UDP, weshalb Daten nicht von einem anderen Port empfangen werden können. 'SendTo()' und 'BeginReceiveFrom()' haben diese Bindungsbedingung nicht. –

+0

Richtig, aber ich benutze im Allgemeinen sendto und beginne, Verwechslungen zu vermeiden – jython234

+0

Das Senden von UDP-Paketen ohne eine Bindung ist die * typische * Verwendung, aber das Senden von Paketen mit einer Bindung wird ebenfalls verwendet. Um eine Sitzung zwischen zwei bestimmten Peers einzurichten und das Betriebssystem Pakete von unerwünschten Peers außerhalb der Sitzung ignorieren zu lassen. –