在DELPHI下如何使用AcceptEx函数呢?那位大侠能帮帮我呢!! 谢谢了!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 AcceptEx一般用在完成端口方式的socket编程中的,它的作用就是可以同时接收处理大量连接,不像Accept有数量限制(如果同时连入太多的话会有部分连不上)。它和Accept的最大区别是Accept是等有连接进入后再分配一个Socket用于接收该连接,而AcceptEx是事先分配好一个接收用的Socket和接收ip信息与第一个包的内存空间然后等待别人连入,所以在接收连接速度上非常快。 而且AcceptEx除了接收连接外还能同时接收要求对方必须发送的第一个包(如果收不到这个包则不会接受对方的连接请求),这个特性可以用于防止DDOS攻击。一般使用时都是事先分配好一批socket和内存然后用n个AcceptEx一次性将这批socket投递出去。然后通过完成端口的通知事件来处理已经Accept的连接。 老兄呀,你说的对。这些我知道的,可是如何在DELPHI中调用这个函数呢?我用下面的方法调用这个函数:LPVOID = Pointer; LPPER_IO_OPERATION_DATA = ^ PER_IO_OPERATION_DATA ; PER_IO_OPERATION_DATA = packed record Overlapped: OVERLAPPED; DataBuf: TWSABUF; Buffer: array [0..DATA_BUFSIZE] of CHAR; IO:IOOperation; end;...PerIoData: LPPER_IO_OPERATION_DATA ;..PerIoData := LPPER_IO_OPERATION_DATA(GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA))); if (PerIoData = nil) then begin continue; end; ZeroMemory(@PerIoData.Overlapped, sizeof(OVERLAPPED)); PerIoData.IO:=IoAccept; PerIoData.DataBuf.len := DATA_BUFSIZE; PerIoData.DataBuf.buf := @PerIoData.Buffer; AcceptExBack:=AcceptEx(Listensc,Accept,@(PerIoData.DataBuf),PerIoData.DataBuf.len,sizeof(SOCKADDR_IN) + 16,sizeof(SOCKADDR_IN) + 16,RecvBytes,poverlapped(@(PerIoData.Overlapped)));可是返回的AcceptExBack总是FALSE不知道为什么? AcceptEx是异步函数,不会等待而是立即返回的,所以调用几乎都是返回false的,此时WSAGetLastError = ERROR_IO_PENDING 可是我在使用客户端向服务端发送连接和消息的时候,服务端函数GetQueuedCompletionStatus一点反应没有。是不是我没有使用WSAIoctl函数将ACCEPTEX函数引入的问题呢?可是如何引入呢?我使用了很多办法都没有办法引入! 有关string类型 listView读数据变颜色 关于SQL Server 2000的视图查询 长时间不出结果的问题 如何检测软驱里是否有软盘? 跪求高手来帮助我啊!谢谢! 请问各位,小弟有礼 如何使用ADOQUERY中的setfields?? 将Paradox7.0(delphi5.0自带的数据库)转换成sql2000。全分奉送。 对于一个Foxpro表,Delphi如何在当前位置插入一个记录? 怎么从文件流或API的文件系统中读取一文本行? 如何将Dos下运行的程序执行结果显示到自己的程序中? NT服务 求助
我用下面的方法调用这个函数:LPVOID = Pointer;
LPPER_IO_OPERATION_DATA = ^ PER_IO_OPERATION_DATA ;
PER_IO_OPERATION_DATA = packed record
Overlapped: OVERLAPPED;
DataBuf: TWSABUF;
Buffer: array [0..DATA_BUFSIZE] of CHAR;
IO:IOOperation;
end;
...
PerIoData: LPPER_IO_OPERATION_DATA ;
..
PerIoData := LPPER_IO_OPERATION_DATA(GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA)));
if (PerIoData = nil) then
begin
continue;
end;
ZeroMemory(@PerIoData.Overlapped, sizeof(OVERLAPPED));
PerIoData.IO:=IoAccept;
PerIoData.DataBuf.len := DATA_BUFSIZE;
PerIoData.DataBuf.buf := @PerIoData.Buffer;
AcceptExBack:=AcceptEx(Listensc,Accept,@(PerIoData.DataBuf),PerIoData.DataBuf.len,sizeof(SOCKADDR_IN) + 16,sizeof(SOCKADDR_IN) + 16,RecvBytes,poverlapped(@(PerIoData.Overlapped)));可是返回的AcceptExBack总是FALSE不知道为什么?
可是如何引入呢?我使用了很多办法都没有办法引入!