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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2012, 20:28   #1
WestDragon
Пользователь
 
Регистрация: 10.04.2011
Сообщений: 15
По умолчанию WinSock2. Клиент-сервер на Delphi XE2. Проблема компиляции

Имеется:
  • XE2 Starter
  • Пример клиента-сервера на WinSock (Пример).
Мои действия:
  1. Скачал с сайта пример
  2. Выбрал проект сервера
  3. Поменял в uses WinSock на WinApi.WinSock2 (Так как мне нужен именно WinSock2)
  4. Меняю строку if (Winsock.Connect(hSocket, Addr, SizeOf(Addr)) = 0) then на if (Winsock2.Connect(hSocket, Addr, SizeOf(Addr)) = 0) then
  5. Начинаю компиляцию
Вижу ошибки:
  • [DCC Warning] prjServer.dpr(102): W1044 Suspicious typecast of string to PAnsiChar
  • [DCC Error] prjServer.dpr(107): E2033 Types of actual and formal var parameters must be identical
  • [DCC Warning] prjServer.dpr(119): W1022 Comparison always evaluates to True
  • [DCC Error] prjServer.dpr(171): E2010 Incompatible types: 'PAnsiChar' and 'PWideChar'
  • [DCC Warning] prjServer.dpr(177): W1057 Implicit string cast from 'AnsiChar' to 'string'
  • Failed
Суть проблемы:
Волнует вторая ошибка, так как она жалуется на параметр Addr: TSockAddrIn. Данная функция говорит что ей нужно Addr: TSockAddr. Но вот в чём проблема, как только я меняю тип данной переменной, она жалуется на строки:

Код:
Addr.sin_family   := AF_INET;
Addr.sin_port     := htons(hPort);
Addr.sin_addr.S_addr := INET_ADDR(PChar(GetIPFromHost(hHost)));
Полазил по исходникам WinApi.Winsock2, у данного типа и правда нет sin_family, sin_port, sin_addr.S_addr.

Кто может помочь разобраться в чём дело или предоставить свой пример? Был бы очень рад. По поводу PAnsiChar можете не отписываться.

Последний раз редактировалось WestDragon; 25.03.2012 в 20:44.
WestDragon вне форума Ответить с цитированием
Старый 27.03.2012, 12:17   #2
WestDragon
Пользователь
 
Регистрация: 10.04.2011
Сообщений: 15
По умолчанию

Никто не в курсе?
WestDragon вне форума Ответить с цитированием
Старый 30.03.2012, 09:35   #3
WestDragon
Пользователь
 
Регистрация: 10.04.2011
Сообщений: 15
По умолчанию

Тема всё ещё актуальна
WestDragon вне форума Ответить с цитированием
Старый 28.04.2012, 18:09   #4
YYYYY
Пользователь
 
Регистрация: 16.08.2009
Сообщений: 28
По умолчанию

Здравствуйте, помню бился с этой проблемой на ХЕ. На ХЕ2 ещё не перешёл - пробуйте. Вот моя функция, я ничего из неё не убирал,- выберите, что Вам надо сами. На ХЕ работает и сейчас.
Код:
function CREATESOCKET(N,port: Integer): TSocket;
var
 timeout : TTimeVal;
 spaddr : TSockAddr;
 i,spaddrlen: Integer;
 a: AnsiString;
 b: array of Char;
 bb: PChar;
 HostEnt: PHostEnt;
begin
//--------------------Создание сокета-----------------------------
 timeout.tv_usec := 0;
 timeout.tv_sec := StrToInt(MainForm.TimeValEdit.Text)*60;
        Result := Socket(AF_INET,SOCK_STREAM,0);
                         if Result = INVALID_SOCKET then
                          begin
(MainForm.FindComponent('lab'+IntToStr(N)+'x'+IntToStr(13))as TLabel).Caption:=
'Ошибка создания сокета';
ExitOut(N);
exit;
                          end;
//        setsockopt(Result, SOL_SOCKET, SO_RCVTIMEO, @timeout, sizeof(ttimeval));

        //-------------Запонение структуры адреса--------------------
        //--------------------и соединение---------------------------
{}while Connecting=0 do
 begin
  (MainForm.FindComponent('lab'+IntToStr(N)+'x13')as TLabel).Caption:='Жду подключения к интернету...';
  Application.ProcessMessages;
  Sleep(5000);
  if Connecting<>0 then sleep(5000);
  (MainForm.FindComponent('lab'+IntToStr(N)+'x13')as TLabel).Caption:='';
 end;
//=========
  HostEnt := gethostbyname(PAnsiChar(P[N].Nazva));
       if HostEnt=nil then
        begin
         shutdown(Result,SD_Receive);
         closesocket(Result);
         (MainForm.FindComponent('lab'+IntToStr(N)+'x'+IntToStr(13))as TLabel).Caption:='Адрес не действителен...';
         ExitOut(N);
         exit;
        end;
  a:= IntToStr(Byte(HostEnt.h_addr^[0]))+'.'+
      IntToStr(Byte(HostEnt.h_addr^[1]))+'.'+
      IntToStr(Byte(HostEnt.h_addr^[2]))+'.'+
      IntToStr(Byte(HostEnt.h_addr^[3]))+':'+IntToStr(Port);
  SetLength(b,Length(a)+1);
  for i:=1 to Length(a) do b[i-1]:=Char(a[i]);
  bb:=PChar(b);
  spaddrlen:= SizeOf(spaddr);
  WSAStringToAddress(bb, AF_INET, nil, spaddr, spaddrlen);
//=========
  i:=0;
   while connect(Result, spaddr, sizeof(spaddr)) = SOCKET_ERROR do
    begin
     Sleep(500);
     i:=i+1;
       if i=20 then
        begin
         shutdown(Result,SD_Receive);
         closesocket(Result);
         (MainForm.FindComponent('lab'+IntToStr(N)+'x'+IntToStr(13))as TLabel).Caption:='Сайт не доступен...';
         ExitOut(N);
         exit;
        end;
    end;
//=========
end;
YYYYY вне форума Ответить с цитированием
Старый 07.06.2013, 11:03   #5
EndDie
Новичок
Джуниор
 
Регистрация: 07.06.2013
Сообщений: 1
По умолчанию

Уважаемый WestDragon, господа!
Столкнулся с той же проблемой:

Код:
var
  adr: TSockAddr;
with adr do
    begin
      sin_family := AF_INET;
      sin_port := htons(LPort);
      integer(sin_addr) := inet_addr(PAnsiChar(PeerIP));
    end;

Ругается: [DCC Error] udpsock.pas(82): E2003 Undeclared identifier: 'sin_family'
тоже и с sin_port и с sin_addr

В winsock2:

Код:
TSockAddrIn = packed record
    case Integer of
      0: (sin_family : u_short;
          sin_port   : u_short;
          sin_addr   : TInAddr;
          sin_zero   : array[0..7] of Char);
      1: (sa_family  : u_short;
          sa_data    : array[0..13] of Char)
  end;
  PSockAddrIn = ^TSockAddrIn;
  TSockAddr   = TSockAddrIn;
  PSockAddr   = ^TSockAddr;
  SOCKADDR    = TSockAddr;
  SOCKADDR_IN = TSockAddrIn;
Не поделитесь решением описываемой Вами проблемы, если ее удалось побороть?
Заранее благодарю.

Последний раз редактировалось EndDie; 07.06.2013 в 13:03.
EndDie вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Embarcadero Delphi XE2 Partner DVD (Зборник компонентов для XE2) volod3000 Софт 2 01.11.2011 02:26
сервер-клиент, recv-send и проблема с передаваемыми символами. Ksardas13 Общие вопросы C/C++ 9 27.03.2011 20:49
Сервер и клиент Indy (delphi) Nice42ru Помощь студентам 0 09.12.2009 19:33
Проблема с соединением Клиент-Сервер ImmortalAlexSan Работа с сетью в Delphi 1 13.01.2009 14:45
проблема с клиент-сервер khaz Общие вопросы Delphi 9 14.12.2006 15:16