2016-06-03 6 views
-1

Ich habe ein Programm, das eine Nachricht an einen Server sendet, und der Server erkennt die Nachricht, interpretiert sie und sendet die Nachricht an den Port zurück, von dem sie am Anfang zugehört hat. Nehmen wir an, der Client sendet von Port 5000. Der Server liest die Nachricht von Port 5000 und sendet eine Nachricht an den Port zurück, den der Client zum Senden der Nachricht verwendet hat, damit der Client sie empfangen kann. Meine Frage ist jetzt, dass ich keinen Port für den Server reparieren möchte (ich will nicht, dass der Server immer zurück zum Klienten zum Port 1000 sendet), wie kann ich also wissen, welchen Port mein Klient verwendete, um die Nachricht zu senden jedes Mal? Also in meinem Client, mein UdpClient Listener = neuer UdpClient (xxx) [(xxxx) ist die Portnummer] kann jedes Mal mit einem neuen Wert gefüllt werden? der Wert des Ports verwendet er die NachrichtWie man weiß, welcher UDP-Port zum Senden einer Nachricht verwendet

dank

hier

senden mein Programm:

private const int sendPort = 9999; 
    static void Main(string[] args) 
    { 
     Boolean done = false; 
     IPAddress send_to_address = IPAddress.Parse("xx.xxx.xxx.xxx"); 
     IPEndPoint sending_end_point = new IPEndPoint(send_to_address, sendPort); 
     IPEndPoint receiving_end_point = new IPEndPoint(IPAddress.Any, 0); 
     UdpClient Listener = new UdpClient(WHAT TO PUT HERE???); 
    while (!done) 
    { 
     Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     Console.WriteLine("Enter text to send"); 
     string text_to_send = Console.ReadLine(); 
     // the socket object must have an array of bytes to send. 
     // this loads the string entered by the user into an array of bytes. 
     byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send); 

     // Remind the user of where this is going. 
     Console.WriteLine("sending to address: {0} port: {1}", sending_end_point.Address, sending_end_point.Port); 
     sending_socket.SendTo(send_buffer, sending_end_point); 
     Console.WriteLine("Message has been sent to the broadcast address"); 
     Console.WriteLine("Now we are waiting for a message back from the Listener"); 

     // here we receive the Message from the Server 
     Byte[] ByteFromListener = Listener.Receive(ref receiving_end_point); 
     string datafromreceiver = Encoding.ASCII.GetString(ByteFromListener); 
Console.WriteLine(Datafrom receiver) 



     } 

    } 
} 

}

+1

jedes Paket 4 Stücke von Daten darin aufweisen muss, minimal. Ursprüngliche IP und Port und Ziel IP und Port. Es spielt keine Rolle, welchen Port Ihr Client verwendet hat - der Server wird diese Informationen in den Paketheadern erhalten, damit er weiß, wohin er die Antwort senden soll. –

+0

Können Sie nicht einfach die 'IPEndPoint' Informationen verwenden? – itsme86

+0

Ich verstehe, aber jetzt hört der Client die Nachricht vom Server, woher weiß ich, welchen Port ich verwende, damit der Client die Nachricht zurückerhält? – George

Antwort

0

Die Antwort war ganz einfach. Ich brauchte nur den gleichen Socket, um die Nachricht zu empfangen. Hier

ist der Code:

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 

class Program 
{ 
    private const int sendPort = 9999; 
    static void Main(string[] args) 
    { 
     Boolean done = false; 
     IPAddress send_to_address = IPAddress.Parse("10.128.105.177"); 
     IPEndPoint sending_end_point = new IPEndPoint(send_to_address, sendPort); 
     EndPoint receiving_end_point = new IPEndPoint(IPAddress.Any, 0); 
    while (!done) 
    { 
     Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     Console.WriteLine("Enter text to send"); 
     string text_to_send = Console.ReadLine(); 
     // the socket object must have an array of bytes to send. 
     // this loads the string entered by the user into an array of bytes. 
     byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send); 

     // Remind the user of where this is going. 
     Console.WriteLine("sending to address: {0} port: {1}", sending_end_point.Address, sending_end_point.Port); 
     sending_socket.SendTo(send_buffer, sending_end_point); 
     Console.WriteLine("Message has been sent to the broadcast address"); 
     Console.WriteLine("Now we are waiting for a message back from the Listener"); 


     Byte[] ByteFromListener = new byte[8000]; 
     sending_socket.ReceiveFrom(ByteFromListener, ref receiving_end_point); 

     string datafromreceiver; 
     datafromreceiver = Encoding.ASCII.GetString(ByteFromListener).TrimEnd('\0');   

     //Here we print the message from the server 
     Console.WriteLine(datafromreceiver.ToString()); 



     } 

    } 
} 

}