The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Linux UDP server + Windows clients"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Linux UDP server + Windows clients"
Сообщение от zalevic emailИскать по авторуВ закладки on 24-Ноя-03, 17:04  (MSK)
Проблема такая - Linux UDP сервер не принимает широковещательные пакеты с клиентов windows (на Linux не проверял, но думая то же самое), но если указать адрес сервера, то все работает, правда не определяется адрес отправителя самого первого пакета :(
---------------------- Linux UDP server
  fd_set fd;
  struct timeval timeout;
  int from_len, opt, res;
  struct sockaddr_in sin, from_sin;
  char buf[255];

  sock = socket(AF_INET, SOCK_DGRAM, 0);
  opt = 1;
  opt = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
  from_len = sizeof(opt);
  memset (&sin, 0, sizeof(sin));
  memset (&from_sin, 0, sizeof(sin));
  sin.sin_family = AF_INET;
  sin.sin_addr.s_addr = ADDR;
  sin.sin_port = htons(_PORT);
  bind(sock, (struct sockaddr *)&sin, sizeof(sin));
  while (1) {
    FD_ZERO(&fd);
    FD_SET(sock, &fd);
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    res = select(sock + 1, &fd, NULL, NULL, &timeout);
    if (res == 0) continue;
    res = recvfrom(sock, buf, sizeof(buf), 0, &from_sin, &from_len);
--------------------
// вывод адреса не работает на первом пакете, почему?
--------
    printf("r=%d l=%d dgram (%s) recieved from (%s:%d)\n", res, from_len, buf, inet_ntoa(from_sin.sin_addr.s_addr), ntohs(from_sin.sin_port));
--------------------------------------------- Linux UDP end

---------------------------------------------Windows client
  int s, opt = 1, result;
  struct sockaddr_in saddr;
  WSAData wsadata;
  char buf[100];
  fd_set fd;
  timeval timeout;

  result = WSAStartup(MAKEWORD(1, 1), &wsadata);
  saddr.sin_family = AF_INET;
  saddr.sin_addr.s_addr = INADDR_ANY; // работает только с конкретным ip
  saddr.sin_port = 0;
  s = socket(AF_INET, SOCK_DGRAM, 0);
  setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(int));
  bind(s, (struct sockaddr *)&saddr, sizeof(saddr));

  saddr.sin_family = AF_INET;
  saddr.sin_addr.s_addr = INADDR_BROADCAST;
  saddr.sin_port = htons(_PORT);
  memset(buf, 0, sizeof(buf));
  strcat(buf, "test");
  for (int i = 0; ; ) {
    sendto(s, buf, strlen(buf), 0, (sockaddr *)&saddr, sizeof(saddr));
-------------------------------------Windows end
sendto возвращает 4, все как положено, но сервер пакет не ловит...
где-то должна быть ошибка, но где не понимаю...

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Linux UDP server + Windows clients"
Сообщение от zalevic emailИскать по авторуВ закладки on 25-Ноя-03, 10:40  (MSK)
попробовал ловить пакеты в винде - все работает...
что-то не то с Linux? или ловить широковещательные пакеты надо по-другому?
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру