2012-03-17 3 views
0

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

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

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

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

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

+0

Вы делаете вызов для выбора в цикле? Насколько отличается код для приема с обеих сторон? –

+0

На данный момент у меня довольно странная ситуация. Серверный сокет привязан к INADDR_BROADCAST, а клиентский сокет привязан к 127.0.0.1 на том же порту. Я могу получить на клиенте, но я не могу отправить, если я не отвяжу (закрыть сокет) клиентом, но потом я не могу его получить. Однако, чтобы ответить на ваш вопрос, да, я зациклирую код выбора/получения. Код практически идентичен для сервера и клиента. –

ответ

0

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

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

+0

Это интересно, оказывается, действительно, когда я удаляю код привязки с сервера, я могу отправлять и получать между клиентом и сервером. Огромное спасибо. –

Смежные вопросы