В рамках простого сетевого проекта я пытаюсь соединить два компьютера вместе, чтобы отправить простой пакет данных.Клиент использует широковещательную рассылку для поиска серверов, и мой сервер успешно обнаруживает эту широковещательную передачу от клиента.
Затем сервер отправляет ответный пакет, однако я не могу заставить клиента прослушать пакет.
Проблема, похоже, заключается в методе широковещания, так как, если я использую прямое соединение с сервером, то есть вместо 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, которые я использовал, и ни одна не возвращает никаких ошибок.
Я также попытался создать второй сокет только дляпрослушивание того же порта, но это конфликтует с сервером и, следовательно, не открывается.
Итак, по сути, я пытаюсь спросить: как я могу заставить клиента прослушивать ответ из трансляции?- иначе адрес сервера сначала неизвестен, я пытаюсь создать новый сокет, используя адрес ответа, однако я не получаю адрес ответа от широковещательной рассылки, несмотря на то, что сервер получает широковещательную рассылку и определенно отправляет ответ.