Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Широковещание по UDP, Не могу принять сообщение 
:(
    Опции темы
Rowi
Дата 9.1.2006, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



Здравствуйте, все!

Пытаюсь сделать приём-передачу широковещательных сообщений по UDP.
Фрагменты кода передающей и принимающей сторон привожу ниже, чтобы не прерывать мысль.

Имею следующую проблемку.
  • Если я запускаю такой код сервера (принимающей стороны) напрямую от кнопки (в OnClick), то программа виснет намертвоsmile...
  • Подозревая, что функция recvfrom блокирует ход программы, я пробовал впихнуть этот код в поток (Thread). Тогда ничего не виснет, не блокирует, но и ничего не принимаетsmile...
Подскажите, пожалуйста, то ли какая-то ошибка в коде (том или другом), то ли сокет надо переводить в какой-нибудь неблокирующий режим, то ли что-то ещё другое?

Заранее спасибо!

Код передающей стороны (клиента):

Код

procedure Broadcast(OutMsg: PChar);
var
  wData : WSADATA;
  WorkSocket: TSocket;
  b: boolean;
  server_addr: TSockAddrIn;
begin
   if WSAStartup(MAKEWORD(1,1), wData) <> 0 then  // Загружаем WinSock
   begin
     MessageDlg('Cannot load WinSock',mtError,[mbOk],0);
     exit;
   end;

  WorkSocket:= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //  Создаём сокет

// Переводим сокет в РЕЖИМ ШИРОКОВЕЩАНИЯ
  b:= true;
  setsockopt(WorkSocket, SOL_SOCKET, SO_BROADCAST, @b, sizeof(Boolean));

  // Заполняем структуру адреса
  server_addr.sin_addr.s_addr := htonl(INADDR_ANY);
  server_addr.sin_family := AF_INET;
  server_addr.sin_port := htons(Port);
  server_addr.sin_addr.S_addr := inet_addr('255.255.255.255');

// Отправляем сообщение
  if SendTo(WorkSocket, OutMsg, sizeof(OutMsg), 0,
    server_addr, sizeof(server_addr)) = SOCKET_ERROR then
      b:= false;

// Уходим
  CloseSocket(WorkSocket); 
  WSACleanup;
end;


Код принимающей стороны (сервера):
Код

function Recieve: string;
var
  wData : WSADATA;
  WorkSocket: TSocket;
  iSize: integer;
  local_addr, client_addr: TSockAddrIn;
  Buff: array [0..255] of char;
begin
   if WSAStartup(MAKEWORD(1,1), wData) <> 0 then  // Загружаем WinSock
   begin
     MessageDlg('Cannot load WinSock',mtError,[mbOk],0);
     exit;
   end;

  WorkSocket:= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //  Создаём сокет

  // Заполняем структуру адреса
  local_addr.sin_addr.s_addr := htonl(INADDR_ANY);
  local_addr.sin_family := AF_INET;
  local_addr.sin_port := htons(Port);

  //Связываем с локальным адресом
  if bind(WorkSocket, local_addr, sizeof(local_addr)) = SOCKET_ERROR then
  begin
    TestWinSockError('Bind'); // анализ ошибки
    exit;
  end;

  // Принимаем
  iSize:= sizeof(client_addr);
  if recvfrom(WorkSocket,Buff, 255, 0,
    client_addr, iSize) <> SOCKET_ERROR then
      Result:= string(Buff);

// Уходим
  CloseSocket(WorkSocket); 
  WSACleanup;
end;


M
Girder
Поиск...

PM MAIL   Вверх
Romikgy
Дата 11.1.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(Rowi @ 9.1.2006, 01:29 Найти цитируемый пост)
Если я запускаю такой код сервера (принимающей стороны) напрямую от кнопки (в OnClick), то программа виснет намертво

Да надо обрабатывать в отдельном потоке

Цитата(Rowi @ 9.1.2006, 01:29 Найти цитируемый пост)
procedure Broadcast(OutMsg: PChar);


Цитата(Rowi @ 9.1.2006, 01:29 Найти цитируемый пост)
if SendTo(WorkSocket, OutMsg, sizeof(OutMsg), 0,
    server_addr, sizeof(server_addr)) = SOCKET_ERROR then
      b:= false;

А терь посмотри , что у тя шлется ??? указатель на строку у тя шлется а не строка!!!!
Мож есть еще косяки, но сначала исправь отсылание строки.


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Rowi
Дата 12.1.2006, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 12.12.2005
Где: Украина

Репутация: нет
Всего: нет



Romikgy
На счёт указателя согласен, тормознул! Спасибо!
Я заменил входной параметр на (OutMsg: string), но увы... Видимо, что-то ещё...

Функция SendTo(...) возвращает SOCKET_ERROR. С помощью WSAGetLastError получаю код ошибки 10065. Но что это означает, и с чем его едят?
PM MAIL   Вверх
Romikgy
Дата 16.1.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Цитата(Rowi @ 12.1.2006, 00:28 Найти цитируемый пост)
код ошибки 10065



WSAEHOSTUNREACH = 10065 - No Route to Host

http://support.ipswitch.com/kb/WSK-19980714-EM06.htm



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.