Как часть простого сетевого проекта, я пытаюсь подключить два компьютера вместе, чтобы отправить простой пакет данных. Клиент использует широковещательную рассылку для поиска серверов, и мой сервер успешно обнаруживает эту трансляцию от клиента.Как слушать ответ сервера от трансляции?
Затем сервер отправляет ответный пакет, однако мне не удается заставить клиента прослушивать пакет.
Проблема связана с методом широковещания, поскольку, если я использую прямое подключение к серверу, то вместо INADDR_BROADCAST я указываю IP-адрес 127.0.0.1 или 192.168.0.x, тогда сервер подключается, отправляет ответ, и клиент получает его.
Слушание код в клиенте:
// Stop the client from waiting for packets if there are none.
fd_set checksockets;
checksockets.fd_count = 1;
checksockets.fd_array[0]=m_listenSocket;
struct timeval t;
t.tv_sec=0;
t.tv_usec=0;
int waiting = select(NULL, &checksockets, NULL, NULL, &t);
// If there is at least one packet receive it.
if(waiting>0) {
std::cout << "Packet received.\n";
}
С этого момента я попытаться найти адрес сервера с помощью метода recvfrom().
Я сделал так, чтобы использовать флаг широковещательной передачи на клиентском сокете сразу после его создания. Это не возвращает ошибок.
int value=true;
int result = setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&value, sizeof(value));
Я проверил все возможные функции WINSOCK, которые я использовал, и никто не возвращает никаких ошибок.
Я также попытался создать второй сокет только для прослушивания на том же порту, но это конфликтует с сервером и поэтому не открывается.
Так что, по сути, я пытаюсь спросить: как я могу заставить клиента слушать ответ из трансляции? - иначе имя сервера неизвестно сначала, я пытаюсь создать новый сокет, используя адрес ответа, однако я не получаю адрес ответа из трансляции, несмотря на то, что сервер получает широковещательную передачу и определенно отправляет ответ.
Вы делаете вызов для выбора в цикле? Насколько отличается код для приема с обеих сторон? –
На данный момент у меня довольно странная ситуация. Серверный сокет привязан к INADDR_BROADCAST, а клиентский сокет привязан к 127.0.0.1 на том же порту. Я могу получить на клиенте, но я не могу отправить, если я не отвяжу (закрыть сокет) клиентом, но потом я не могу его получить. Однако, чтобы ответить на ваш вопрос, да, я зациклирую код выбора/получения. Код практически идентичен для сервера и клиента. –