Как узнать, когда DatagramSocket находится в состоянии приема
Я использую UDP-реализацию UDP с использованием DatagramSocket, где прием выполняется в одном потоке, а операции отправки выполняются в отдельном потоке. Когда моя программа запускается, мне нужно позвонить на сервер и получить информацию обратно. Проблема заключается в том, что из-за многопоточности, хотя я сначала запускаю принимающий поток, иногда отправка отправляется первым, и когда сервер отвечает, сокет еще не вызвал receive() в другом потоке. Поскольку этот поток блокируется в строке receive(), я не могу использовать флаг для проверки того, что receive() был вызван. Есть ли способ проверить, блокирует ли сокет в данный момент функцию receive(), чтобы я мог ждать отправки, пока не проверим это условие?
2 ответа
Запустите поток tx из потока rx непосредственно перед циклом recvfrom() и поместите sleep(2000) в начало потока tx, прежде чем он тоже начнет обходить свою очередь ввода или что-то еще, что он обычно делает, чтобы получить материал для отправки.
Вам не нужны две розетки.
Создать сингл
DatagramSocket.
Он находится в "состоянии приема" немедленно.Запустите поток получения, который получает через
DatagramSocket.
Запустите поток отправки, который отправляет через
DatagramSocket.
Порядок (2) и (3) больше не имеет значения.