<Winsock2.WSASendTo> 函数调用错误 系统错误-0X6   返回值:为-1 转换后为 0xFFFFFFFF 此问题时好时坏的,大概是眼异步投递有点一点关系。但还是很搞不明白。如果连续发送100个包,会有10个左右包报这个错!
分不够可以再加上!!

解决方案 »

  1.   

    WSA_INVALID_HANDLE
    6
     
    Specified event object handle is invalid. 
    An application attempts to use an event object, but the specified handle is not valid. Note that this error is returned by the operating system, so the error number may change in future releases of Windows.
     句柄无效
      

  2.   

    调用WSAGetLastError看看,应该是WSAEBADF,也就是句柄无效
      

  3.   

    返回值就是WSAGetLastError 返回的。 如果是句柄无效的话,为什么时好时坏呀?
      

  4.   

    设置了.
      blen := FRecvBuffSize * 10; //让接收缓冲足够大
      bFlag := true;
      setsockopt(FRecvSocket, SOL_SOCKET, SO_REUSEADDR, PChar(@bFlag),
        sizeof(bFlag));
      setsockopt(FRecvSocket, SOL_SOCKET, SO_RCVBUF, Pchar(@blen),
        sizeof(blen));
      setsockopt(FRecvSocket, SOL_SOCKET, SO_SNDBUF, Pchar(@blen),
        sizeof(blen));
      

  5.   

    创建代码:
      FIOCPHwnd := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
      FRecvSocket := WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, nil, 0,
        WSA_FLAG_OVERLAPPED);
      blen:=FRecvBuffSize*10;   //让接收缓冲足够大
      bFlag := true;
      setsockopt(FRecvSocket, SOL_SOCKET, SO_REUSEADDR, PChar(@bFlag),
        sizeof(bFlag));
      setsockopt(FRecvSocket, SOL_SOCKET, SO_RCVBUF, Pchar(@blen),
        sizeof(blen));
      setsockopt(FRecvSocket, SOL_SOCKET, SO_SNDBUF, Pchar(@blen),
        sizeof(blen));
      if Winsock2.bind(FRecvSocket, @addr, sizeof(addr)) <> 0 then
      begin
        StaLog('绑定套接字失败!error:0x%0x',[WSAGetLastError]);
        exit;
      end;  //绑定IOCP与Socket
      CreateIoCompletionPort(FRecvSocket, FIOCPHwnd, Cardinal(FRecvSocket),
        (FSystemInfo.dwNumberOfProcessors * 20) + 2);发送部分如下:function TUdpIocpServer.SendBuff(iIP: string; iPort: Integer; var buf;
      iLen: Integer): Boolean;
    var
      byteSend, Flags: DWORD;
      ErrorCode,temp: integer;
      p: PIOCPUDPHandleData;
      retu: Cardinal;
    begin
      Result := False;
      if not Active then
        exit;
      Flags := 0;
      ErrorCode := -1;
      New(p);
      p.Statu := ssSend;
      p.Buffer := #0;
      p.wsaBuffer.buf := @p.Buffer[0];
      CopyMemory(@p.Buffer[0], @buf, iLen);
      p.wsaBuffer.len := iLen;
      p.wsaRecv := 0;
      p.wsaSend := iLen;
      p.SockAddr.sin_addr.s_addr := inet_addr(PChar(iIP));
      p.SockAddr.sin_family := AF_INET;
      p.SockAddr.sin_port := htons(iPort);
      p.SockAddrLen := Sizeof(p.SockAddr);
      p.Statu := ssSend;
      try
        byteSend := 0;
        //直接发送方式
       //        ErrorCode := Winsock2.SendTo(FRecvSocket,Buf,iLen,Flags,p^.SockAddr,p^.SockAddrLen);
       //   返回发送的字节数   //通过IOCP发送
        ErrorCode := Winsock2.WSASendTo(FRecvSocket,
          //用于标识一个已连接的套接口,该套接口以WSA_FLAG_OVERLAPPED标志调用WSASocket()创建。
          @(p.wsaBuffer), //一个指向WSABUF结构数组的指针。每个WSABUF结构包含缓冲区的指针和缓冲区的大小。
          1, //lpBuffers数组中WSABUF结构的数目。
          byteSend,
          Flags,
          @(p^.SockAddr), //指针,指向目标套接口的地址
          p^.SockAddrLen, //lpTo中地址的大小
          @(p.Overlapped), //指向WSAOVERLAPPED结构的指针
          nil       );    temp:=WSAGetLastError;
        if ErrorCode <> 0 then
          StaLog('<Winsock2.WSASendTo> 函数调用错误 系统错误-0X%0x (%s)  返回值:0x%0x', [temp,GetErrorStr(temp),ErrorCode]);  except
        StaLog('发送数据时发生错误.');
      end;
      Result := ErrorCode = 0;
    end;