The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Linux UDP server + Windows clients, !*! zalevic, 24-Ноя-03, 17:04  [смотреть все]
Проблема такая - 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, все как положено, но сервер пакет не ловит...
где-то должна быть ошибка, но где не понимаю...




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

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