Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу разобраться с функцией GetAcceptExSockAddrs


Страницы:   1 2

Григорьев Антон ©   (2004-09-28 11:03:00) 

Вот код юнита, сделанного мною специально для тестирования этой функции:

unit AETUnit;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,WinSock,
 StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

function AcceptThreadFunc(Param:Pointer):Integer;
var S1,S2:TSocket;
    Addr,AddrIn,AddrOut:TSockAddr;
    Buf:array[0..999] of Byte;
    Cnt:DWORD;
    AddrInLen,AddrOutLen:Integer;
    Ov:TOverlapped;
 begin
  FillChar(Buf,SizeOf(Buf),0);
  S1:=Socket(AF_Inet,Sock_Stream,0);
  S2:=Socket(AF_Inet,Sock_Stream,0);
  Addr.sin_family:=AF_Inet;
  Addr.sin_port:=htons(12345);
  Addr.sin_addr.S_addr:=Inet_Addr('127.0.0.1');
  FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);
  Cnt:=Bind(S1,Addr,SizeOf(Addr));
  Cnt:=Listen(S1,1);
  Ov.hEvent:=CreateEvent(nil,False,False,nil);
  AcceptEx(S1,S2,@Buf,100,32,32,Cnt,@Ov);
  GetOverlappedResult(S1,Ov,Cnt,True);            // (*)
  GetAcceptExSockAddrs(@Buf,100,32,32,AddrIn,AddrInLen,AddrOut,AddrOutLen);
  Result:=Cnt
 end;

procedure TForm1.Button1Click(Sender: TObject);
var S:TSocket;
    Addr:TSockAddr;
    Buf:string;
    Data:TWSAData;
    ThreadID:Cardinal;
begin
 WSAStartup($101,Data);
 BeginThread(nil,0,AcceptThreadFunc,nil,0,ThreadID);
 Sleep(100);
 S:=Socket(AF_Inet,Sock_Stream,0);
 Addr.sin_family:=AF_Inet;
 Addr.sin_port:=htons(12345);
 Addr.sin_addr.S_addr:=Inet_Addr('127.0.0.1');
 FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);
 Connect(S,Addr,SizeOf(Addr));
 Sleep(1000);
 Buf:='abcde';
 Send(S,Buf[1],Length(Buf)+1,0);
 Sleep(500);                                     // (**)
 Button1.Caption:='OK'
end;

end.

Запускаю, ставлю строку останова на строку (*), прохожу главную нить под отладчиком. Точка останова срабатывает, когда выполнение доходит до строки (**). Смотрю, что лежит в буфере Buf и вижу там, во-первых, присланные данные, а во-вторых, адрес отправителя и адрес сокета, к которому оказывается привязан сокет S2, т.е. до этого места всё нормально. Но когда я делаю следующий шаг и выполняю строку (*), в переменных AddrIn и AddrOut оказывается полная ерунда (хотя переменные AddrInLen и AddrOutLen получают значение 16, как и должно быть). Но тех значений, которые в результате копируются в AddrIn и AddrOut, в Buf просто нет! Откуда эти данные берутся - не понимаю, но они всегда одни и те же. Пробовал вместо стандартного модуля WinSock использовать WinSock 2 Алекса Коншина - результат тот же самый. Экспериментировал с различными значениями размеров буфера - ничего не меняется. В своём коде ошибки не вижу, в MSDN'е описаний такой проблемы не нашёл. В чём может быть дело?


Digitman   (2004-09-28 11:53:00) [21]

WSAStartup($ 202,Data);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо