完成端口方面得问题,希望有经验得朋友可以给个指导

ddgfei 2005-07-02 01:57:55
我使用完成端口处理客户端接收数据得时候,只接收不发送,一切数据都是正常得。
但是,当我加入发送得功能得时候,这时如果接收得缓冲区小于发送文件得长度,我接收得数据就是不正常得(乱吗,但是接收得数据长度是正确得),不知你们有没有碰到这种情况?

struct ClientContext
{

CRITICAL_SECTION SockCritSec;
SOCKET m_Socket;

char m_strAddr[20];
// Store buffers
CBuffer m_ReadBuffer;
CBuffer m_WriteBuffer;

// Input Elements for Winsock
WSABUF m_wsaInBuffer;
BYTE m_byInBuffer[4194304

// Output elements for Winsock
WSABUF m_wsaOutBuffer;
BYTE m_byOutBuffer[64];

HANDLE m_hWriteComplete;


ClientContext* m_pWriteContext;
ClientContext* m_pReadContext;

};
这是我定义得用于代表连接节点得数据体
...全文
241 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddgfei 2005-07-05
  • 打赏
  • 举报
回复
有一点我还是不能想明白,就是为什么产生数据覆盖,而我将接收缓冲区设置很大却没有数据覆盖(接收数据正常)得问题??
ddgfei 2005-07-05
  • 打赏
  • 举报
回复
谢谢kugou123(酷狗)(http://www.xiaozhou.net)得建议,不过现在协议已经定下来了,无法再更改,呵呵……
诚如goodboyws(深夜不眠者)所说:我得接收顺序产生了数据覆盖,所以会出现错误!谢谢你们得帮助
ddgfei 2005-07-04
  • 打赏
  • 举报
回复
sodme(大宝) 我看《Windows网络编程》是这样处理得

goodboyws(深夜不眠者) ( )怎么才能处理数据覆盖?怎么可以知道是数据覆盖?
「已注销」 2005-07-04
  • 打赏
  • 举报
回复
CRITICAL_SECTION SockCritSec;

兄弟,有点猛哦。一个连接就给一个CRITICAL_SECTION呀?
goodboyws 2005-07-04
  • 打赏
  • 举报
回复
数据覆盖了吧
ddgfei 2005-07-04
  • 打赏
  • 举报
回复
VCSQLVB(九龙.君威) 代码??很长,你想看哪部分?
lifengice0706(无)我在发送和接收之前先要获得这个锁CRITICAL_SECTION SockCritSec;
kugou123 2005-07-04
  • 打赏
  • 举报
回复
文件发送之前可以先把文件大小发给对方,然后定义一个固定的缓冲区,读一部分,发一部分,那边收一部分,通过字节数和文件大小比较是否发送完毕。这样的话,再大的文件都可以发啊。
ddgfei 2005-07-04
  • 打赏
  • 举报
回复
up
ddgfei 2005-07-04
  • 打赏
  • 举报
回复
请问你们一般最大接收多大文件?我现在系统可以一次接收8M大小得文件,
lifengice0706 2005-07-04
  • 打赏
  • 举报
回复
个人认为逻辑的串行比加锁强。我以前做了个完成端口的例子,包括tcp和udp的接收和发送,唯一的忠告是:当处理有结构的数据流时,一定要提供缓冲区,并设计完整的处理来解包。多测试就行了。
VCSQLVB 2005-07-03
  • 打赏
  • 举报
回复
没碰到过,把你的代码帖来看看。
lifengice0706 2005-07-03
  • 打赏
  • 举报
回复
从你的结构中看不出什么问题,不知你的乱码是什么意思,在使用完成端口时:注意在一个时间点上,对同一的socket的recv和send操作最好只有一个,即不要在没拿到result时,再对同一socket进行重复操作。

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧