A
Another_eYes
Unregistered / Unconfirmed
GUEST, unregistred user!
用AcceptEx接收客户端连接后 调用GetAcceptExSockAddrs试图获取local ip和remote ip,结果@#$%%^&*@@#!!
不断尝试各种可能15小时终告失败。 只得放弃GetAcceptExSockAddrs而直接从那块buffer中特定偏移量处复制获取了ip. 心有不甘,特向各位大富翁求教。
部分关键代码:
说明:
fnextsocket是TCPServer中的一个类变量,
fnextsocket.FOV.ov是个_OVERLAPPED结构
fnextsocket.fsockethandle是一个socket句柄
fnextsocket.faddr是TSockAddrIn结构,用于存储address信息
fhandle是TCPServer中的变量,用来listen的socket句柄
fSockAddrs是TCPServer中的一个数组:array [0..63] of byte;
procedure TCPServer.AcceptNext;
var
l: Cardinal;
begin
fillchar(fnextsocket.FOV.ov, sizeof(_OVERLAPPED), #0);
fnextsocket.FSocketHandle := winsock2.socket(AF_INET, SOCK_STREAM, 6);
if acceptex(fhandle, fnextsocket.fSocketHandle, @fsockaddrs, 0, 32,
32, l, poverlapped(@(fnextsocket.fov))) then
tryacceptuser
else if getlasterror <> ERROR_IO_PENDING then
close;
end;
procedure TCPServer.TryAcceptUser;
var
name: TSockAddrIn;
l1, l2: Integer;
flg : Boolean;
begin
GetAcceptExSockaddrs(pointer(@fsockaddrs), 6, 32,
32, name, l1, fnextsocket.faddr, l2);
flg := true;
if assigned(fcanaccept) then
FCanAccept(inet_ntoa(fnextsocket.fAddr.sin_addr), flg);
if flg then
。。。。
end;
-->中断于GetAcceptExSockaddrs,察看fsockaddrs得到数据:
(1, 0, 0, 0, 1, 0, 0, 0, 14, 0, 2, 0, 4, 210, 192, 168, 100, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 2, 0, 15, 191, 192, 168, 100, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
很明显,通过肉眼观察可以发现local ip和 remote ip都是 192.168.100.80
继续运行GetAcceptExSockaddrs后却得到:
name为:
(sin_family:9824, sin_port:208, sin_addrs_un_bs_b1:'$',s_b2: '
不断尝试各种可能15小时终告失败。 只得放弃GetAcceptExSockAddrs而直接从那块buffer中特定偏移量处复制获取了ip. 心有不甘,特向各位大富翁求教。
部分关键代码:
说明:
fnextsocket是TCPServer中的一个类变量,
fnextsocket.FOV.ov是个_OVERLAPPED结构
fnextsocket.fsockethandle是一个socket句柄
fnextsocket.faddr是TSockAddrIn结构,用于存储address信息
fhandle是TCPServer中的变量,用来listen的socket句柄
fSockAddrs是TCPServer中的一个数组:array [0..63] of byte;
procedure TCPServer.AcceptNext;
var
l: Cardinal;
begin
fillchar(fnextsocket.FOV.ov, sizeof(_OVERLAPPED), #0);
fnextsocket.FSocketHandle := winsock2.socket(AF_INET, SOCK_STREAM, 6);
if acceptex(fhandle, fnextsocket.fSocketHandle, @fsockaddrs, 0, 32,
32, l, poverlapped(@(fnextsocket.fov))) then
tryacceptuser
else if getlasterror <> ERROR_IO_PENDING then
close;
end;
procedure TCPServer.TryAcceptUser;
var
name: TSockAddrIn;
l1, l2: Integer;
flg : Boolean;
begin
GetAcceptExSockaddrs(pointer(@fsockaddrs), 6, 32,
32, name, l1, fnextsocket.faddr, l2);
flg := true;
if assigned(fcanaccept) then
FCanAccept(inet_ntoa(fnextsocket.fAddr.sin_addr), flg);
if flg then
。。。。
end;
-->中断于GetAcceptExSockaddrs,察看fsockaddrs得到数据:
(1, 0, 0, 0, 1, 0, 0, 0, 14, 0, 2, 0, 4, 210, 192, 168, 100, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 14, 0, 2, 0, 15, 191, 192, 168, 100, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
很明显,通过肉眼观察可以发现local ip和 remote ip都是 192.168.100.80
继续运行GetAcceptExSockaddrs后却得到:
name为:
(sin_family:9824, sin_port:208, sin_addrs_un_bs_b1:'$',s_b2: '