2016-06-03 4 views
-1

У меня есть программа, которая отправляет сообщение серверу, и сервер узнает, что сообщение интранет его и отправляет обратно сообщение на порт, который он прослушивал с самого начала. так, скажем, клиент отправляет с порта 5000. Сервер будет читать сообщение с порта 5000 и отправить сообщение на порт, который клиент использовал для отправки сообщения, чтобы клиент мог его получить. Теперь мой вопрос заключается в том, что я не хочу исправлять порт для сервера (я не хочу, чтобы сервер всегда отправлял обратно клиенту на порт 1000), так как я могу узнать, какой порт мой клиент использовал для отправки сообщения каждый раз? Итак, в моем клиенте мой UdpClient Listener = новый UdpClient (xxx) [(xxxx), являющийся номером порта], может быть заполнен новым значением каждый раз? значение порта он используется для отправки сообщенияКак узнать, какой порт UDP используется для отправки сообщения

благодаря

вот моя программа:

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

каждый пакет должен иметь 4 порции данных в нем, как минимум. Исходный IP и порт, а также IP-адрес и порт назначения. не имеет значения, какой порт ваш клиент решил использовать - сервер получит эту информацию в заголовках пакетов, чтобы он знал, куда отправить ответ. –

+0

Не можете ли вы использовать информацию 'IPEndPoint'? – itsme86

+0

Я понимаю, но теперь клиент слушает сообщение с сервера, как я знаю, какой порт я использую для клиента, чтобы вернуть сообщение? – George

ответ

0

Ответ был довольно прост. Просто нужно использовать тот же сокет для получения сообщения.

Вот код:

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()); 



     } 

    } 
} 

}

Смежные вопросы