谢谢了!!

解决方案 »

  1.   

    AcceptEx一般用在完成端口方式的socket编程中的,它的作用就是可以同时接收处理大量连接,不像Accept有数量限制(如果同时连入太多的话会有部分连不上)。它和Accept的最大区别是Accept是等有连接进入后再分配一个Socket用于接收该连接,而AcceptEx是事先分配好一个接收用的Socket和接收ip信息与第一个包的内存空间然后等待别人连入,所以在接收连接速度上非常快。 而且AcceptEx除了接收连接外还能同时接收要求对方必须发送的第一个包(如果收不到这个包则不会接受对方的连接请求),这个特性可以用于防止DDOS攻击。一般使用时都是事先分配好一批socket和内存然后用n个AcceptEx一次性将这批socket投递出去。然后通过完成端口的通知事件来处理已经Accept的连接。
      

  2.   

    老兄呀,你说的对。这些我知道的,可是如何在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不知道为什么?
      

  3.   

    AcceptEx是异步函数,不会等待而是立即返回的,所以调用几乎都是返回false的,此时WSAGetLastError = ERROR_IO_PENDING
      

  4.   

    可是我在使用客户端向服务端发送连接和消息的时候,服务端函数GetQueuedCompletionStatus一点反应没有。是不是我没有使用WSAIoctl函数将ACCEPTEX函数引入的问题呢?
    可是如何引入呢?我使用了很多办法都没有办法引入!