Я делаю некоторые базовые сообщения Socket. У меня есть подпрограмма, которая работает хорошо, но есть проблема под нагрузкой.
Я использую UDP для выполнения SendTo без установления соединения, чтобы в основном выполнить операцию, подобную ping, чтобы проверить, есть ли кто-нибудь из моих слушателей в локальной сети. В идеале я бы просто использовал широковещательный адрес, но беспроводные маршрутизаторы, похоже, не передают мою широковещательную рассылку. Моя работа заключается в том, чтобы перебирать все IP-адреса в подсети и отправлять грамм данных на каждый IP-адрес. Другие ПК слушают, и если они получат сообщение, они ответят, и именно так я заставлю Пиров найти друг друга. Вот код в цикле, который отправляет грамм данных каждому IP в подсети.
string msgStr = "some message here...";
byte[] sendbuf = Encoding.ASCII.GetBytes(msgStr);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Blocking = true;
socket.SendTo(sendbuf, remoteEndPt);
//socket.Close();
Это работает, но когда диапазон подсетей велик, скажем, 255.255.0.0 (что означает ~ 60 000 IP-адресов для итераций), я в конечном итоге получу исключение SocketException с кодом ошибки "10022", что означает "Недопустимый аргумент". Обычно это происходит после ~ 10000 или около того успешных отправок, и я начинаю видеть эту ошибку. Кроме того, маршрутизатор, который я использую на работе, обрабатывает его и, вероятно, является мощным маршрутизатором, но дешевый в моей лаборатории - тот, который выдает ошибку.
Если я добавлю время ожидания после перехвата SocketException и до возобновления цикла, оно, как правило, восстановится, но в конце концов я получу ошибку снова.
Я думаю, что происходит то, что буфер на маршрутизаторе переполнен, и я больше не могу отправлять данные. Более качественный на работе может справиться с этим, но дешевый - увязнет. Это звучит правдоподобно?
Пара вопросов:
1) При использовании SendTo в режиме без установления соединения мне нужно вызывать Close () на моем Socket?
Я не видел никакой пользы в вызове Close (), но когда я вызываю Close (), это сильно замедляет мою итерацию (у меня это закомментировано выше, потому что это сильно замедляет работу). Имеет ли это смысл?
2) Можно ли мне сказать, что мне следует подождать, прежде чем пытаться отправить больше данных? Кажется неправильным просто поймать Исключение, которое я до сих пор не знаю, в чем причина.
Спасибо, J.