Задать вопрос

Как заставить работать широковещательное сообщение?

Использую в своей программе (MS VC++) UDP broadcast. Тестирую между настольным компом (Win7) и нетбуком (XP). Они объединены в сеть посредством вайфай: у нетбука встроенный, а в комп воткнут свисток, который работает в режиме точки доступа. Проблема в том, что если отправлять сообщение с компа на нетбук, то оно не доходит. Обратно работает. И если объединить устройства в сеть витой парой через роутер — также работает в обе стороны. Видимо, проблема именно в таком подключении через свисток. Можно ли как-то это обойти?

Вот код отправки:
void SendBroadcast(char * message) {
    SOCKET s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(s == -1) {
        printf("Error in creating socket");
        return;
    }
    char opt = 1;
    setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof(char));
    SOCKADDR_IN brdcastaddr;
    memset(&brdcastaddr,0, sizeof(brdcastaddr));
    brdcastaddr.sin_family = AF_INET;
    brdcastaddr.sin_port = htons(MY_PORT);
	brdcastaddr.sin_addr.s_addr = INADDR_BROADCAST;
    int len = sizeof(brdcastaddr);

    char sbuf[1024];
	//Заполнение sbuf здесь

    sendto(s, sbuf, (int)strlen(sbuf), 0, (sockaddr*)&brdcastaddr, len);
    closesocket(s);
}


А это код приема:
DWORD WINAPI BroadcastProcess(LPVOID arg) {
	SOCKET broadcastServerSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if(broadcastServerSock == -1) {
		printf("Error in creating socket");
		return 0;
	}

	SOCKADDR_IN UDPserveraddr;
	memset(&UDPserveraddr,0, sizeof(UDPserveraddr));
	UDPserveraddr.sin_family = AF_INET;
	UDPserveraddr.sin_port = htons(MY_PORT);
	UDPserveraddr.sin_addr.s_addr = INADDR_ANY;

	int len = sizeof(UDPserveraddr);

	if(bind(broadcastServerSock, (SOCKADDR*)&UDPserveraddr,sizeof(SOCKADDR_IN)) < 0) {
		printf("ERROR binding in the server socket");
		return 0;
	}


	char rbuf[1024];
	SOCKADDR_IN clientaddr;
	len = sizeof(clientaddr);
	while(true) {
		int received=recvfrom(broadcastServerSock,rbuf, 1023, 0, (sockaddr*)&clientaddr, &len);
		if(received>0) {
			rbuf[received]='\0';

			char *p = inet_ntoa(clientaddr.sin_addr);
			int serverportno = ntohs(clientaddr.sin_port);

			MessageBoxA(g_hWnd,rbuf,"",MB_OK);
		}
	}
	return 0;
}
  • Вопрос задан
  • 6052 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@JDima
Вы ведь осознаете, что ваши чакры основательно загнутся от написания кода, полагающегося на броадкасты, и после этого оттопырить их не удастся никогда?
Используйте L2 или L3 мультикаст. На неуправляемых свитчах он ведет себя как броадкаст. На управляемых все куда приятнее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Qwadrat
@Qwadrat
Возможно в случае отправки с компа бродкаст пакеты идут не с того интерфейса?
Воспользуйтесь Wireshark для диагностики.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы