<Winsock2.WSASendTo> 函数调用错误 系统错误-0X6 返回值:为-1 转换后为 0xFFFFFFFF 此问题时好时坏的,大概是眼异步投递有点一点关系。但还是很搞不明白。如果连续发送100个包,会有10个左右包报这个错!
分不够可以再加上!!
分不够可以再加上!!
解决方案 »
- 问个发送短信的问题
- 请教在DBGrid组件中显示时间类型数据的问题.
- Dll 加载 MDI 窗体的时候出现了问题
- 自学编程也有两年了,对VB\VC\DELPHI\JAVA\ASP都有所了解,看一些代码也能看懂个70-80%,可是要编个东西就是无从下手,不知该如何提高?请
- 如何解决BMP图像写入内存流的时候很耗时
- 100分:adoconnection连接问题!
- 如何实现工具栏显示gif图片,实现动画效果???
- 如何对stringgrid或dbgrid中选定的区域进行操作,在线等,进来有分,回答对立即结分
- 关于Tstringgrid的行颜色改变的问题??
- 有没有好的excel报表控件
- delphi中Lcdscreen控件
- 那里有比较经典,比较专业的专家系统编程书籍,最好有例子
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.
句柄无效
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));
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;