社区
网络通信/分布式开发
帖子详情
IOCP UDP 函数 WSASendTo 发送失败。100分奉上!
HeroicDragon
2009-08-12 04:56:37
<Winsock2.WSASendTo> 函数调用错误 系统错误-0X6 返回值:为-1 转换后为 0xFFFFFFFF
此问题时好时坏的,大概是眼异步投递有点一点关系。但还是很搞不明白。如果连续发送100个包,会有10个左右包报这个错!
分不够可以再加上!!
...全文
444
11
打赏
收藏
IOCP UDP 函数 WSASendTo 发送失败。100分奉上!
函数调用错误 系统错误-0X6 返回值:为-1 转换后为 0xFFFFFFFF 此问题时好时坏的,大概是眼异步投递有点一点关系。但还是很搞不明白。如果连续发送100个包,会有10个左右包报这个错! 分不够可以再加上!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
HeroicDragon
2009-08-24
打赏
举报
回复
高手都不理偶了,伤心绝望!
HeroicDragon
2009-08-17
打赏
举报
回复
创建代码:
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;
HeroicDragon
2009-08-17
打赏
举报
回复
我再顶,等待高手!!!!
sanguomi
2009-08-15
打赏
举报
回复
没代码,大家都在猜
HeroicDragon
2009-08-15
打赏
举报
回复
晕啊,难道真像这样沉下去了。伤心郁闷中......
HeroicDragon
2009-08-13
打赏
举报
回复
设置了.
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));
HeroicDragon
2009-08-13
打赏
举报
回复
要沉了,顶上!!!
shuihan20e
2009-08-12
打赏
举报
回复
你有没有设置系统接收缓冲区?
HeroicDragon
2009-08-12
打赏
举报
回复
返回值就是WSAGetLastError 返回的。
如果是句柄无效的话,为什么时好时坏呀?
gyk120
2009-08-12
打赏
举报
回复
调用WSAGetLastError看看,应该是WSAEBADF,也就是句柄无效
kampan
2009-08-12
打赏
举报
回复
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.
句柄无效
网络协议 --
UDP
协议(5)
UDP
的
IOC
P实现
关于
IOC
P网络模型的介绍可以参考:http://blog.csdn.net/china_jeffery/article/details/78815373
IOC
P模型对协议是没限制的,无论是TCP还是
UDP
都是支持的。
UDP
的
IOC
P模型实现的不同之处在于投递
发送
请求和接受请求所用的
函数
不同: int WSARecvFrom( SOCKET s, LPWSABUF lpBuffe
IOC
P使用小结
很多知识,只有自己亲自实践了才知道坑在哪里。 socket是内核对象句柄,每次对socket执行操作,需要用户对象到内核对象的转换,执行完成返回结果,需要内核对象到用户对象的转换。
IOC
P的中文名称是完成端口,目前是Windows下最高效的网络模型。特点:半异步,非阻塞。(我理解的完全异步是回调式,不需要人工参与,但是
IOC
P的异步需要轮询)。 其他模型的缺点: 1)se...
【转】关于Socket和
IOC
P的一些值得注意的地方
转至:http://laokaddk.blog.51cto.com/368606/287039关于Socket和
IOC
P的一些值得注意的地方
IOC
P是一整套高性能的IO操作异步模型,可以用在文件操作也可以用在网络SOCKET操作上面。当用在网络SOCKET上时,在服务器端主要配合AceeptEx W
SAS
en
d W
SAS
en
dto
来使用,在客户机端主要配合ConnectEx WSARec
关于Socket和
IOC
P的一些值得注意的地方
IOC
P是一整套高性能的IO操作异步模型,可以用在文件操作也可以用在网络SOCKET操作上面。当用在网络SOCKET上时,在服务器端主要配合AceeptEx W
SAS
en
d W
SAS
en
dto
来使用,在客户机端主要配合ConnectEx WSARecv和WSARecvFrom来使用。这几天用
IOC
P模型模仿IPMSG软件时有一些感触,分享如下:(这里没有具体的使用常识,这部分请参考《Windows
select、epoll使用、
IOC
P使用
Linux下网络socket编程——实现服务器(select)与多个客户端通信(参考的) Linux编程之select 使用epoll实现一个
udp
server && cli
en
t
网络通信/分布式开发
1,593
社区成员
32,964
社区内容
发帖
与我相关
我的任务
网络通信/分布式开发
Delphi 网络通信/分布式开发
复制链接
扫一扫
分享
社区描述
Delphi 网络通信/分布式开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章