Как прослушать ответ сервера из трансляции? - PullRequest
0 голосов
/ 17 марта 2012

В рамках простого сетевого проекта я пытаюсь соединить два компьютера вместе, чтобы отправить простой пакет данных.Клиент использует широковещательную рассылку для поиска серверов, и мой сервер успешно обнаруживает эту широковещательную передачу от клиента.

Затем сервер отправляет ответный пакет, однако я не могу заставить клиента прослушать пакет.

Проблема, похоже, заключается в методе широковещания, так как, если я использую прямое соединение с сервером, то есть вместо 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, которые я использовал, и ни одна не возвращает никаких ошибок.

Я также попытался создать второй сокет только дляпрослушивание того же порта, но это конфликтует с сервером и, следовательно, не открывается.

Итак, по сути, я пытаюсь спросить: как я могу заставить клиента прослушивать ответ из трансляции?- иначе адрес сервера сначала неизвестен, я пытаюсь создать новый сокет, используя адрес ответа, однако я не получаю адрес ответа от широковещательной рассылки, несмотря на то, что сервер получает широковещательную рассылку и определенно отправляет ответ.

1 Ответ

0 голосов
/ 17 марта 2012

Как вы указали, вы не получите никакого возврата при привязке к INADDR_BROADCAST. Это нормально: когда вы привязаны к адресу, вы получаете пакеты только с этого адреса. Вам не нужно связывать сокеты с любым адресом вообще. Эта операция обычно требуется для подключенных сокетов (т. Е. TCP). Если получающий сокет работает, я думаю, это потому, что вы выполняете все свои тесты на одной машине.

Если вы хотите получать пакеты с данного адреса, вы можете попробовать использовать connect или sendto и receivefrom.

...