Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: UDP широковещание  (Прочитано 9814 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cvaleriy
Гость
« : 20-01-2004 08:10 » 

Хочу написать сканер HL серверов. Столкнулся с проблемой рассылки датаграмм широковещания. В чем проблема ? Тестирую на локальной машине (адаптер Мелкософта замыкания на себя). WinXP.

Код:
int n=1;
SOCKET s5;
SOCKADDR_IN addr;
long rc;

s5=socket(AF_INET,SOCK_DGRAM,0);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_port=htons(27015);

rc = bind(s5,(struct sockaddr*)&addr,sizeof(addr));
if (rc==SOCKET_ERROR)
{
printf("error bind %d\n",WSAGetLastError);
return 1;
}
rc = setsockopt(s5,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n));
if (rc==SOCKET_ERROR)
{
printf("Error setting socket option %d\n",WSAGetLastError);
return 1;
}
rc=sendto(s5,info,strlen(info),0,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
if (rc==SOCKET_ERROR)
{
printf("Error sending %d\n",WSAGetLastError);
return 1;
}

rc=recvfrom(s5,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
printf ("Server IP: %s", inet_ntoa(remoteAddr.sin_addr));
« Последнее редактирование: 23-11-2007 18:53 от Алексей1153++ » Записан
cvaleriy
Гость
« Ответ #1 : 20-01-2004 10:15 » new

Нашел ошибку - функция sendto возвращает колво посланных байт а я его на нулевое проверял )))
тут другой прикол теперь программа задумывается на приеме данных...
Записан
ixania
Гость
« Ответ #2 : 21-01-2004 00:27 » 

Не задумывается а блокирует пока на сокет не прийдут данные, воспользуйся select - ом, либо WSAAsyncSelect если у приложения есть окно.
Записан
cvaleriy
Гость
« Ответ #3 : 26-01-2004 13:53 » 

правда не до конца но по крайней мере сервера уже ищет.
может кому пригодится....
Код:

#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>


int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}


int main(int argc, char *argv[])
{
  long rc;
  SOCKET s;
  SOCKADDR_IN addr;
  SOCKADDR_IN remoteAddr;
  int remoteAddrLen = sizeof(remoteAddr);
  char buf[256];
  char info[]="\xff\xff\xff\xff"
  "infostring\n\0";

memset(buf,0,strlen(buf));

  rc=startWinsock();
if(rc!=0)
  {
    printf("Error : startWinsock, error  code: %d\n",rc);
    return 1;
  }

  s=socket(AF_INET,SOCK_DGRAM,0);
  if(s==INVALID_SOCKET)
  {
    printf("Error: couldn't create the socket , error code: %d\n",WSAGetLastError());
closesocket(s);
  WSACleanup;
    exit(1);
  }

int i = 27015;
int n=1;
rc = setsockopt(s,SOL_SOCKET,SO_BROADCAST,&n,sizeof(BOOL));
if (rc==SOCKET_ERROR)
{
printf("Error setting options %d\n",WSAGetLastError());
closesocket(s);
  WSACleanup;
exit(1);
}
    addr.sin_family=AF_INET;
addr.sin_addr.s_addr = INADDR_BROADCAST;
addr.sin_port=htons(i);

rc=sendto(s,info,strlen(info),0,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
if(rc==SOCKET_ERROR)
{
  printf("Error send, error code: %d\n",WSAGetLastError());
  closesocket(s);
  WSACleanup;
  exit(1);
}

rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
if (rc=SOCKET_ERROR)
{
printf("Error receive data, code is %d\n",WSAGetLastError());
closesocket(s);
  WSACleanup;
exit(1);
}

printf("Server : %s at port %d\n",inet_ntoa(remoteAddr.sin_addr),ntohs(remoteAddr.sin_port));

closesocket(s);

WSACleanup;
exit(0);
}
« Последнее редактирование: 23-11-2007 18:53 от Алексей1153++ » Записан
cvaleriy
Гость
« Ответ #4 : 12-03-2004 05:59 » 

В общем так... то же широковещание хочу сделать в неблокируемых сокетах. создал, перевел, а дальше что делать ? В ступоре уже какой день...getsockopt ? select ? как проверить чем он там занимается ? готов ли к чтению/записи, вообще просто прочитать из сокета ? recvfrom ругается матом.... вообще какой алгоритм этих неблокируемых сокетов ?
Реализовал сканер перез многопоточность, но тут некоторые сервера то ли не успевают проконнектиться то ли хз что... в общем поток сканирования вырубается до того, как я успеваю получить информацию...
или 3 секунд для локалки маловато ?
я это сделал так: родитель создает потомок-поток, ждет его три секунды, после закрывает сокет.... потомок в это время сканит сеть  в режиме блокирующего сокета. Подскажите как правильней реализовать все это ?
Идеи кончились. Жду помощи...
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 12-03-2004 11:04 » 

Цитата: cvaleriy
В общем так... то же широковещание хочу сделать в неблокируемых сокетах. создал, перевел, а дальше что делать ? В ступоре уже какой день...getsockopt ? select ? как проверить чем он там занимается ? готов ли к чтению/записи, вообще просто прочитать из сокета ? recvfrom ругается матом.... вообще какой алгоритм этих неблокируемых сокетов ?
Неблокируемый сокет при  операциях ввода-вывода или выполнит операцию, или вернет ошибку EAGAIN (другое название EWOULDBLOCK). Т.е. готовность сокета надо проверять. Ввод: дождатся готовности и прочитать данные. Вывод: попытаться записать и если ошибка установить ожидание готовности для записи. Стандартный механизм ожидания - select(), но для win рекомендуют ф-ии серии WSA*().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines