兄台留步,请教IOCP,俺把分都送了,欢迎大家来讨论

starthere 2005-07-12 10:57:38
typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
CHAR Buffer[DATA_BUFSIZE];
DWORD BytesSEND;
DWORD BytesRECV;
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;


typedef struct
{
SOCKET Socket;
} PER_HANDLE_DATA, * LPPER_HANDLE_DATA;

问题是,我如何能保证能接受到客户端的完整消息,又能完整的把处理过的消息
发过去,比如接收到了40B,处理完后的数据量为1KB,另外在哪儿进行处理?MSDN上的
例子是把接收到的消息,没有进行处理原封不动的发回去,但是现在主要是接收到了消息
处理后发过去....

...全文
328 点赞 收藏 25
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
周江涛 2006-06-16
WSASend,你爱在哪调就在哪调用。
回复
bisc2095 2006-06-16
这帖子 toooooold
回复
周江涛 2006-06-16
怎么没扣楼主信誉分。这么久都不结贴。
回复
whwjn 2006-06-15
hehe
回复
sdf123321 2006-04-19
楼主有结果了吗?
回复
striking 2006-04-19
2005-7-12 10:57:39 发表的帖子, 还没有结贴..



汗ing~~~~~~~~~~~
回复
sdf123321 2006-04-14
我也正在搞IOCP,碰到跟你一样的问题了,希望交流一下。qq:81811761
回复
jeng 2006-04-14
IOCP不会发不完整的啊,它是调用后在后台进行发送,正常情况下就是会回报 ERROR_IO_PENDING 的,这不是错。在完整发送后会通过IOCP机制通知调用者的
回复
Tommy 2006-04-14
IOCP不会发不完整的啊,它是调用后在后台进行发送,正常情况下就是会回报 ERROR_IO_PENDING 的,这不是错。在完整发送后会通过IOCP机制通知调用者的
回复
fengge8ylf 2006-04-12
UP
回复
fengge8ylf 2006-04-11
lifengice0706 你叫立锋?不会吧 呵呵
回复
fengge8ylf 2006-04-11
lifengice0706 那就是说我必须要等上一个包完全发送完后才能发下一个包 这样效率是不是就低了 发包时还要有一种机制判断上一个包是否全部发送出去了
回复
gohappy_1999 2006-04-10
gz
回复
ddgfei 2005-07-13
就是让你循环发送
回复
starthere 2005-07-13
if (PerIoData->BytesRECV == 0)
{
//区别消息,并处理,返回
//*****************************************
SwitchMessageFromClient( PerIoData );
//*****************************************
PerIoData->BytesRECV = PerIoData->DataBuf.len;
PerIoData->BytesSEND = 0;
}
else
{
PerIoData->BytesSEND += BytesTransferred;
}

if (PerIoData->BytesRECV > PerIoData->BytesSEND)
{

if (WSASend(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &SendBytes, 0, &(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
SM._PostToScreen("Send() failed with error :",GetLastError());
}


}
else
{

PerIoData->BytesRECV = 0;
Flags = 0;
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->DataBuf.len = DATA_BUFSIZE;
PerIoData->DataBuf.buf = PerIoData->Buffer;

if (WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
SM._PostToScreen("WSARecv() failed with error :",(DWORD)WSAGetLastError());

}
}
}

在 SwitchMessageFromClient( PerIoData );里面
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->DataBuf.buf = (char*)&TAGR ;
PerIoData->DataBuf.len = sizeof(tag_Return);

怎样能保证把信息都发过去?,说详细点....最好是写点代码
回复
VCSQLVB 2005-07-12
WSASend
回复
lifengice0706 2005-07-12
wsasend并不一定能把你要求发的数据全发出去,你可以判断结果中到底发送成功了多少字节,如果小于你要求的数字,你就要将发送指针移动,再发起一次wsasend。直到成功。
回复
starthere 2005-07-12
另外要把程序放在互联网上,要解决的问题包括"有的网速快有的网速慢"的问题,不知是
指哪方面?是不是要确保把服务器处理过的数据完整发到客户端啊?????
回复
starthere 2005-07-12
VCSQLVB(九龙.君威)很是感谢,但是MSDN里的程序中注释中说"
Since WSASend() is not gauranteed to send all of the bytes requested,
continue posting WSASend() calls until all received bytes are sent."
不明白,希望你能讲详细点....
回复
VCSQLVB 2005-07-12
不能的话就不会是ERROR_IO_PENDING错误了。
回复
相关推荐
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2005-07-12 10:57
社区公告
暂无公告