Нужно ли UDP-сокету проходить процесс принятия, как TCP-сокеты?
Я работаю с UDP, и мне было интересно узнать о методе Accept, когда несколько компьютеров должны подключиться к серверу. До сих пор я работал с классом UDPCliente, классом IPEndPoint и методом BeginRecieve / EndRecieve, чтобы создать сервер, к которому несколько компьютеров могут подключаться одновременно.
Мой вопрос прост: нужно ли мне использовать метод Accept для обработки входящего соединения и создания нового сокета для каждого нового соединения?
Каков наилучший способ обработки нескольких соединений с UDP?
Примеры кода, которые я видел до сих пор, создают новый класс UDPClient и IPEndPoint, где сервер после этого ожидает соединения, код вызывает BeginRecieve, передавая функцию получения данных, а затем снова запускает процесс BeginRecieve.
Вот примеры кода, которые я использовал до сих пор:
public static void receiveCallback(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;
byte[] receiveBytes = u.EndReceive(ar, ref e);
UdpState s = new UdpState();
s.e = e;
s.u = u;
u.BeginReceive(new AsyncCallback(receiveCallback), s);
}
public static void receiveMessages()
{
IPEndPoint e = new IPEndPoint(IPAddress.Any, 5050);
UdpClient u = new UdpClient(e);
UdpState s = new UdpState();
s.e = e;
s.u = u;
u.BeginReceive(new AsyncCallback(receiveCallback), s);
}
2 ответа
UDP не имеет соединения, поэтому принимать нечего. Если вам нужны соединения по UDP, то вы должны их реализовать. В идеале вы должны назначать каждому "соединению" какой-то идентификатор и включать его в каждую дейтаграмму, отправляемую на сервер. В некоторых случаях может быть достаточно просто полагаться на IP-адрес и порт для определения "соединений".
Но вы можете делать это как хотите. UDP обрабатывает каждую дейтаграмму как независимую.
Короткий ответ - нет, вы не используете accept()
с UDP.
В UDP нет соединений, только дейтаграммы. Одна сторона отправляет их, а другая может их получить. Каждая датаграмма содержит информацию об отправителе (IP-адрес и порт), которую ваше серверное приложение может извлечь для дифференциации клиентов.