Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2011, 10:50   #1
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию Не останавливается на recvfrom

Приветствую всех. В общем то вопрос в теме. Почему не останавливается не получении данных из сокета? Вот код, из которого выкинуто все, что только можно.

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
IP = '127.0.0.1';
type
  mytype = array of array of longint;
var
  WSAData : TWSAData;
  hst      : PHOSTENT;
  my_sock : TSocket;
  dest_addr: sockaddr_in;
  bsize: integer;
  server_addr: sockaddr_in;
  server_addr_size : integer;
  buff: array [1..500] of char;

begin
  if (WSAStartup(MakeWord(2,2),WSAData)<>0) then
    begin
      exit;
    end;

  my_sock := socket(AF_INET,SOCK_DGRAM,0);
  if (my_sock=INVALID_SOCKET) then
    begin
      WSACleanup();
      exit;
    end;

  dest_addr.sin_family:=AF_INET;
  dest_addr.sin_port:=htons(666);

  if (inet_addr(IP)<>0)then
  begin
    dest_addr.sin_addr.s_addr:=inet_addr(IP);
  end else
  begin
      hst:=gethostbyname(IP);
      dest_addr.sin_addr.s_addr:=mytype(hst.h_addr_list)[0][0];
  end;

  server_addr_size:=sizeof(server_addr);
  bsize:=recvfrom(my_sock,buff,sizeof(buff),0,server_addr, server_addr_size);
  bsize:=recvfrom(my_sock,buff,sizeof(buff),0,server_addr, server_addr_size);
  bsize:=recvfrom(my_sock,buff,sizeof(buff),0,server_addr, server_addr_size);
end;
OS: Windows XP SP3. Помню была такая беда в никсах, но там я не сильно вникал, обошелся проверкой в цикле.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки

Последний раз редактировалось Gambler; 11.01.2011 в 10:52.
Gambler вне форума Ответить с цитированием
Старый 11.01.2011, 11:19   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А биндить сокет кто будет? Или он, по-твоему, должен как папа карло висеть на всех портах сразу? )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.01.2011, 11:22   #3
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Это UDP клиент. на сколько я знаю его не надо с адресом вязать.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 11.01.2011, 11:29   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А ты проверь )

Код:
  bsize:=recvfrom(my_sock,buff,sizeof(buff),0,server_addr, server_addr_size);
  if (SOCKET_ERROR = bsize) then
    ShowMessage('Socket error: ' + IntToStr(WSAGetLastError()));
Если это UDP, это ещё не значит, что он без биндинга проживет. Ты можешь его забиндить на любой интерфейс ('0.0.0.0') и первый свободный порт (хотя это не самое удачное решение с ЮДП), но биндить надо явно или неявно. Неявно - путем отсылки чего-то через сокет. Это TCP-шный сокет неявно биндится при коннекте, а UDP-шному одного recvfrom() мало для биндинга, он просто не знает, на каком же порту ты собрался ловить данные.

И да, в UDP нет клиентов и серверов. Все сокеты равны )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 11.01.2011 в 11:36.
veniside вне форума Ответить с цитированием
Старый 11.01.2011, 11:35   #5
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Спасибо! Ты был прав. Просто раньше всегда перед получение что то отправлял и знать не знал, что этим связываю сокет с адресом.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 11.01.2011, 11:41   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А от кого он тогда по-твоему отправлял пакет? ) В каждом пакете есть IP и PORT как получателя, так и отправителя. Вот чтобы заполнить данные отправителя, сокет и биндится при посылки первого пакета, справедливо считая, что если ты его явно не забиндил, то тебе пофиг, с какого интерфейса и порта он уйдёт.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.01.2011, 13:02   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А от кого он тогда по-твоему отправлял пакет? )
а в UDP особо разницы нет от кого...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.01.2011, 13:10   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Т.е. поля FROM_IP и FROM_PORT в пакете заполняются значениями ПОФИГ_РАЗНИЦЫ_НЕТ? ) Если бы разницы не было, принимающая сторона никогда не узнала бы, от кого пришёл пакет, и, соответственно, никогда не смогла бы на него ответить. Другое дело, что разработчику бывает действительно без разницы, куда там реально прибиндится отправляющий сокет, тут спору нет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посмотрите в чём ошибка процедуры PrintFile. Программа останавливается. Антон Лысенко Помощь студентам 11 26.12.2010 21:07
Останавливается макрос gregory1b Microsoft Office Excel 3 18.11.2010 12:35
задача в паскаль по файлам; не останавливается цикл loveis_myname Помощь студентам 2 28.12.2009 20:48
RecvFrom ошибка Zeraim Работа с сетью в Delphi 5 25.12.2009 01:48
Процедура останавливается на idhttp1.get('') Des Компоненты Delphi 0 18.05.2009 19:05