Я только начал изучать Sockets с помощью различных поисков в Google, но у меня возникли проблемы с выяснением того, как правильно использовать Sockets в C #, и мне нужна помощь.
У меня естьтестовое приложение (Windows Forms) и другого класса (который на самом деле находится в своем собственном .dll, но это не имеет значения) У меня есть весь код сервера / клиента для моего кода сокетов.
Вопрос 1)
В моем тестовом приложении на серверной части пользователь может нажать кнопку «начать прослушивание», и серверная часть моего приложения сокетов должна начать прослушивать соединения по указанному адресу и порту,пока все хорошо.
Однако приложение будет заблокировано, и я ничего не могу сделать, пока кто-то не подключится к серверу.Что делать, если никто не подключается?Как мне справиться с этим?Я мог бы указать время ожидания получения, но что тогда?Это исключение, что я могу с этим сделать?Мне бы хотелось, чтобы в главном приложении была какая-то активность, чтобы пользователь знал, что приложение не зависло, и ожидает подключения.Но если соединение не приходит, оно должно прервать тайм-аут и закрыть все.
Может быть, я должен использовать асинхронные вызовы для отправки / получения методов, но они кажутся запутанными, и я не смог заставить его работать, только синхронная работа(Я опубликую свой текущий код ниже).
Вопрос 2)
Нужно ли что-то закрывать, когда время ожидания некоторых звонков отправки / получения истекает.Как вы увидите из моего текущего кода, у меня есть несколько замыканий в сокете, но это не так.Но он также не чувствует себя хорошо, когда операция заканчивается, и я не закрываю сокет.
В заключение двух моих вопросов .... Я хотел бы приложение, которое не блокирует, так чтопользователь знает, что сервер ожидает соединения (например, с небольшой анимацией выделения).Если через какое-то время соединение никогда не устанавливается, я хочу закрыть все, что должно быть закрыто.Когда соединение установлено или если оно не происходит по прошествии некоторого времени, я хотел бы сообщить основному приложению о результате.
Вот часть моего кода, остальное похоже.Класс Packet
- это пользовательский класс, представляющий мой пользовательский блок данных, на данный момент это просто набор свойств, основанных на enums
, с методами для преобразования их в байты и обратно в свойства.
Функциякоторый начинает прослушивать подключения, выглядит примерно так:
public void StartListening(string address, int port) {
try {
byte[] bufferBytes = new byte[32];
if(address.Equals("0.0.0.0")) {
udpSocket.Bind(new IPEndPoint(IPAddress.Any, port));
} else {
udpSocket.Bind(new IPEndPoint(IPAddress.Parse(address), port));
}
remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
int numBytesReceived = udpSocket.ReceiveFrom(bufferBytes, ref remoteEndPoint);
if(numBytesReceived == 0) {
udpSocket.Close();
return;
}
Packet syncPacket = new Packet(bufferBytes);
if(syncPacket.PacketType != PacketType.Control) {
udpSocket.Close();
return;
}
} catch {
if(udpSocket != null) {
udpSocket.Close();
}
}
}
Я уверен, что у меня есть куча ненужного кода, но я новичок в этом, и я не уверен, что делать, любая помощьисправление моего кода и решение вышеуказанных проблем действительно приветствуется.
РЕДАКТИРОВАТЬ:
Я, вероятно, должен был заявить, что мои требования заключаются в использовании UDP и реализации этихвещи сам на уровне приложений.Вы можете рассматривать это как домашнее задание, но я не пометил как таковое, потому что код не имеет значения и не будет частью моей оценки, и моя проблема (мой вопрос) заключается в том, «как кодировать», так как мой опыт работы с сокетами минимален и неучил.
Однако я должен сказать, что я решил свою проблему на данный момент, я думаю ... Я использовал многопоточность в демонстрационном приложении, которое доставляло мне некоторые проблемы, теперь я использую его в соединениях протокола,имеет больше смысла, и я могу легко изменить свои свойства класса пользовательского протокола и прочитать их из демонстрационного приложения.
Я указал тайм-аут и выбрасываю SocketException, если он достигает тайм-аута.Всякий раз, когда возникает подобное исключение, сокетное соединение закрывается.Я просто говорю о связи рукопожатия, не более того.Если не обнаружено никаких исключений, код, вероятно, прошел гладко, и соединение установлено.
Пожалуйста, измените свои ответы соответствующим образом.Прямо сейчас для меня нет смысла отмечать любой из них как принятый ответ, надеюсь, вы понимаете.