Как узнать, когда DatagramSocket находится в состоянии приема

Я использую UDP-реализацию UDP с использованием DatagramSocket, где прием выполняется в одном потоке, а операции отправки выполняются в отдельном потоке. Когда моя программа запускается, мне нужно позвонить на сервер и получить информацию обратно. Проблема заключается в том, что из-за многопоточности, хотя я сначала запускаю принимающий поток, иногда отправка отправляется первым, и когда сервер отвечает, сокет еще не вызвал receive() в другом потоке. Поскольку этот поток блокируется в строке receive(), я не могу использовать флаг для проверки того, что receive() был вызван. Есть ли способ проверить, блокирует ли сокет в данный момент функцию receive(), чтобы я мог ждать отправки, пока не проверим это условие?

2 ответа

Решение

Запустите поток tx из потока rx непосредственно перед циклом recvfrom() и поместите sleep(2000) в начало потока tx, прежде чем он тоже начнет обходить свою очередь ввода или что-то еще, что он обычно делает, чтобы получить материал для отправки.

Вам не нужны две розетки.

  1. Создать сингл DatagramSocket. Он находится в "состоянии приема" немедленно.

  2. Запустите поток получения, который получает через DatagramSocket.

  3. Запустите поток отправки, который отправляет через DatagramSocket.

Порядок (2) и (3) больше не имеет значения.

Другие вопросы по тегам