![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу разобраться с функцией GetAcceptExSockAddrs
Григорьев Антон © (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);