最近接觸到IOCP的開發,采用非阻塞式AcceptEx來監聽連接。Server端與Client端的通訊都正常。
唯獨在獲取Client的IP的時候利用GetAcceptExSockaddrs無法獲取到!
通過呼叫AcceptEx的指標LPACCEPTEX 與GetAcceptExSockaddrs的指標LPLPGETACCEPTEXSOCKADDRS。
LPACCEPTEX 與LPGETACCEPTEXSOCKADDRS的定義如下:
type
LPACCEPTEX = function(sListenSocket, sAcceptSocket: TSocket;
lpOutputBuffer: Pointer;
dwReceiveDataLength, dwLocalAddressLength, dwRemoteAddressLength: DWORD;
lpdwBytesReceived: PCardinal; lpOverlapped: POVERLAPPED): BOOL; stdcall;
{$EXTERNALSYM LPACCEPTEX}
TLPACCEPTEX = LPACCEPTEX;
const
WSAID_ACCEPTEX: TGUID = (
D1: $B5367DF1; D2: $CBAC; D3: $11CF; D4: ($95, $CA, $00, $80, $5F, $48, $A1,
$92));
{$EXTERNALSYM WSAID_ACCEPTEX}
type
LPGETACCEPTEXSOCKADDRS = procedure(lpOutputBuffer: Pointer;
dwReceiveDataLength,
dwLocalAddressLength, dwRemoteAddressLength: DWORD; var LocalSockaddr:
LPSOCKADDR;
var LocalSockaddrLength: Integer; var RemoteSockaddr: LPSOCKADDR;
var RemoteSockaddrLength: Integer); stdcall;
{$EXTERNALSYM LPGETACCEPTEXSOCKADDRS}
TLPGetAcceptExSockAddrs = LPGETACCEPTEXSOCKADDRS;
const
WSAID_GETACCEPTEXSOCKADDRS: TGUID = (
D1: $B5367DF2; D2: $CBAC; D3: $11CF; D4: ($95, $CA, $00, $80, $5F, $48, $A1,
$92));
投放監聽連接代碼:
m_lpfnAcceptEx(Listen,
PerIoData.Socket,
@PerIoData.Buffer[0],
DATA_BUFSIZE-(Sizeof(SOCKADDR_IN)+16)*2,
(sizeof(sockaddr_in)+16),
(sizeof(sockaddr_in)+16),
@dwBytes,
@(PerIoData.Overlapped));
獲取IP地址代碼:
m_LPGetAcceptExSockaddrs(@PerIoData.Buffer[0],
DATA_BUFSIZE-(Sizeof(SOCKADDR_IN)+16)*2,
Sizeof(SOCKADDR_IN)+16,
Sizeof(SOCKADDR_IN)+16,
LocalAddr,
LocalAddrLen,
ClientAddr,
ClientAddrLen);
通過以上代碼獲取到的ClientAddrizhong始終是nil,望高手解答!
uj5u.com熱心網友回復:
前四個引數都要與 AcceptEx 相同, 確定相同嗎?uj5u.com熱心網友回復:
找成熟的代碼參考一下呀。uj5u.com熱心網友回復:
看過C的代碼,都是一樣的,沒什么區別!
uj5u.com熱心網友回復:
@PerIoData.Buffer[0],感覺這個引數有問題轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88818.html
標籤:網絡通信/分布式開發
