社区
网络通信/分布式开发
帖子详情
IOCP UDP 函数 WSASendTo 发送失败。100分奉上!
踏月捕风逍遥客
2009-08-12 04:56:37
<Winsock2.WSASendTo> 函数调用错误 系统错误-0X6 返回值:为-1 转换后为 0xFFFFFFFF
此问题时好时坏的,大概是眼异步投递有点一点关系。但还是很搞不明白。如果连续发送100个包,会有10个左右包报这个错!
分不够可以再加上!!
...全文
495
11
打赏
收藏
IOCP UDP 函数 WSASendTo 发送失败。100分奉上!
函数调用错误 系统错误-0X6 返回值:为-1 转换后为 0xFFFFFFFF 此问题时好时坏的,大概是眼异步投递有点一点关系。但还是很搞不明白。如果连续发送100个包,会有10个左右包报这个错! 分不够可以再加上!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
踏月捕风逍遥客
2009-08-24
打赏
举报
回复
高手都不理偶了,伤心绝望!
踏月捕风逍遥客
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;
踏月捕风逍遥客
2009-08-17
打赏
举报
回复
我再顶,等待高手!!!!
sanguomi
2009-08-15
打赏
举报
回复
没代码,大家都在猜
踏月捕风逍遥客
2009-08-15
打赏
举报
回复
晕啊,难道真像这样沉下去了。伤心郁闷中......
踏月捕风逍遥客
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));
踏月捕风逍遥客
2009-08-13
打赏
举报
回复
要沉了,顶上!!!
shuihan20e
2009-08-12
打赏
举报
回复
你有没有设置系统接收缓冲区?
踏月捕风逍遥客
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.
句柄无效
libev
en
t实现
UDP
通信
因为libev
en
t在底层上是没有直接支持
udp
通信,并且在Windows上,对于
udp
的
ioc
p操作,libev
en
t也不支持(实际Windows本身是支持
IOC
P实现
UDP
通信的) 不过仍然可以利用libev
en
t实现
udp
通信,调试源码发现,libev
en
t是通过select模型去实现的。 下面的例子实现了先绑定某个端口,当收到消息时,
udp
read_cb发生回调。 如果不需要绑定端口,那么就需要先s
en
dto
后,才能够收到消息,
udp
read_cb才会发生回调。 #include <
功能强大的
IOC
P Socket Server模块源码——完成端口通讯服务器(
IOC
P Socket Server)设计(六)
完成端口通讯服务器(
IOC
P Socket Server)设计(六)功能强大的
IOC
P Socket Servre模块例程源码Copyright © 2009 代码客(卢益贵)版权所有QQ:48092788 源码博客:http://blog.csdn.net/guestcode 本文论坛讨论:http://topic.csdn.net/u/20090921/11/69fe462
TCP与
UDP
协议
TCP报文格式,
UDP
报文格式,TCP与
UDP
协议的比较
TCP、
UDP
详解
首先看下传统的OSI七层模型和TCP/IP五层模型的对应关系 Tcp和
Udp
属于传输层协议,下面详细讲一下这两个协议。
UDP
UDP
的特点
UDP
是无连接的
UDP
不支持可靠传输,是经最大可能交付的
UDP
没有拥塞控制
UDP
支持一对一,一对多,多对多的交互通信
UDP
是面向报文的,即对上层交付下来的报文既不合并也不拆分,仅添加一个
UDP
首部
UDP
的首部格式 首部字段只有 8 个字节,包...
C#
Udp
Socket例子
服务器端: using System; using System.Collections.G
en
eric; using System.Text; using System.Net; using System.Net.Sockets; namespace
UDP
Server { class Program { static void Main...
网络通信/分布式开发
1,594
社区成员
32,945
社区内容
发帖
与我相关
我的任务
网络通信/分布式开发
Delphi 网络通信/分布式开发
复制链接
扫一扫
分享
社区描述
Delphi 网络通信/分布式开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章