iocp接收数据包的问题

us4dmin 2011-08-18 10:33:43
我这是在csdn上提出来关于此的第7个问题了吧。没有一个正面解决。我无奈只有再次提出,以上是数据包发送内容

客户端发送 {1234-6552}
服务端缓冲区 长度是2

从主机 127.0.0.1 接收数据:{1 字节:2 --- thread id: 5140.
从主机 127.0.0.1 接收数据:23 字节:2 --- thread id: 5328.
从主机 127.0.0.1 接收数据:4- 字节:2 --- thread id: 6808.
从主机 127.0.0.1 接收数据:65 字节:2 --- thread id: 7204.
从主机 127.0.0.1 接收数据:52 字节:2 --- thread id: 5140.
从主机 127.0.0.1 接收数据:} 字节:2 --- thread id: 5328.
从主机 127.0.0.1 接收数据: 字节:2 --- thread id: 7204.
从主机 127.0.0.1 接收数据: 字节:2 --- thread id: 6808.
从主机 127.0.0.1 接收数据:{1 字节:2 --- thread id: 5140.
从主机 127.0.0.1 接收数据:23 字节:2 --- thread id: 5328.
从主机 127.0.0.1 接收数据:4- 字节:2 --- thread id: 6808.
从主机 127.0.0.1 接收数据:65 字节:2 --- thread id: 7204.
从主机 127.0.0.1 接收数据:52 字节:2 --- thread id: 5140.
从主机 127.0.0.1 接收数据:} 字节:2 --- thread id: 5328.
从主机 127.0.0.1 接收数据: 字节:2 --- thread id: 7204.
从主机 127.0.0.1 接收数据: 字节:2 --- thread id: 6808.
从主机 127.0.0.1 接收数据:{1 字节:2 --- thread id: 5140.
从主机 127.0.0.1 接收数据:23 字节:2 --- thread id: 5328.
从主机 127.0.0.1 接收数据:4- 字节:2 --- thread id: 6808.
从主机 127.0.0.1 接收数据:65 字节:2 --- thread id: 7204.
从主机 127.0.0.1 接收数据:52 字节:2 --- thread id: 7204.
从主机 127.0.0.1 接收数据:} 字节:2 --- thread id: 5328.


事实证明包顺序完全没有问题,不过一个完整的包分别在不同的iocp工作线程中获取到了2个字节!请问下各位老师,这怎么处理?如果方便请放代码便于小生理解。谢谢各位老师
...全文
298 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
us4dmin 2011-08-20
  • 打赏
  • 举报
回复
请问下楼上的老师,这个可解码数据包长度我如何得知呢?接收很多类型的数据包,根据数据包不一样来交给相应函数处理。这个可解码长度我应该定义多少?
xxq123321 2011-08-20
  • 打赏
  • 举报
回复
楼主,这个问题要问你自己才对,比如你自己定义的协议类型是
命令(1字节)-数据长度(4字节)-数据体(等于数据长度)

如果是这样子设计,可解码长度就是 5 字节,每接收到包的前5个字节,你就可以根据第2-5字节解码出包的大小了

[Quote=引用 11 楼 us4dmin 的回复:]

请问下楼上的老师,这个可解码数据包长度我如何得知呢?接收很多类型的数据包,根据数据包不一样来交给相应函数处理。这个可解码长度我应该定义多少?
[/Quote]
chenjiawei007 2011-08-20
  • 打赏
  • 举报
回复
遇到自己菜还说别人装的人真让人恶心,多问问自己脑袋,为什么别人都不是的问题,自己搞的头大再说吧。
ztsdk 2011-08-19
  • 打赏
  • 举报
回复
其实对于服务器来说,每条连接,只允许读、写请求分别串行即可。
IOCP的乱序很烦的
xxq123321 2011-08-19
  • 打赏
  • 举报
回复
如果你的iocp是用作服务器的,你要对每个客户端socket保留一个数据缓存,同一个包虽然是多线程接收,但是同一时间只会有一个线程接收同一套接字,在一次交互过程中,你按顺序吧每次接收到的数据都添加到这个客户缓存里面做处理
us4dmin 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cauloda 的回复:]
7个问题还没解决???太难了,不会。。
[/Quote]

的确,不少人装!!随便一堆按照自己的理解说下,我不能说这些人不知道,而是根本就没有正面解决或者回答问题,只能说csdn上装的人太多了
v_table 2011-08-19
  • 打赏
  • 举报
回复
7个问题还没解决???太难了,不会。。
us4dmin 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnwyllmm 的回复:]
哪个线程得到了数据就放到同一个缓冲区中,那还得注意顺序
[/Quote]

具体代码呢?
yynetsdk 2011-08-19
  • 打赏
  • 举报
回复
分别在不同的iocp工作线程中获取到了2个字节?

因为是多线程啊,线程交替利用cpu时间,提高工作效率;你也可以只写一个线程,那何必用iocp呢!
羽飞 2011-08-19
  • 打赏
  • 举报
回复
哪个线程得到了数据就放到同一个缓冲区中,那还得注意顺序
xxq123321 2011-08-19
  • 打赏
  • 举报
回复
是这样的,你的代码应该会有一个类或者结构体封装了客户端socket,在这个类或结构体中定义一个数据缓冲,如果你定义的协议包大小没有最大值,可以用string或者自定义可伸缩缓冲对象来存储数据,如

class CClient
{
....
socket m_sClient; //客户端套接字
string m_buffer; //客户缓冲区

}

每次接收数据后,你要按照自己的协议包大小来接收数据,比如

m_buffer.append(buffer,size); //buffer是此次接收的数据,size是接收数据大小 ,
if(m_buffer.size() >= 可解码数据包长度) //接收多少数据后可以解析协议包长度你肯定是知道的
{
//把你的协议包长度解码出来
packetSize = ??
}
if(m_buffer.size() < packetSize)
{
//一个完整包没有接收完才,当然继续接收数据
}
if(m_buffer.size()>=packetSize) //你接收的数据大于等于包长,说明一个完整的包接收完成了
{
string data ;
data.append(m_buffer.data,0,packetsize); //把你的包取出来处理
DoData();
....

//要记得判断m_buffer是否包含下一个包的数据,把前一个包的数据清除
m_buffer = m_buffer.substr(packetsize);

}



[Quote=引用 9 楼 us4dmin 的回复:]

引用 7 楼 xxq123321 的回复:
如果你的iocp是用作服务器的,你要对每个客户端socket保留一个数据缓存,同一个包虽然是多线程接收,但是同一时间只会有一个线程接收同一套接字,在一次交互过程中,你按顺序吧每次接收到的数据都添加到这个客户缓存里面做处理


求老师写点代码,例如如何对每一个单独socket创建一个缓冲区?这个缓冲区大小?好多问题头疼
[/Quote]
us4dmin 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xxq123321 的回复:]
如果你的iocp是用作服务器的,你要对每个客户端socket保留一个数据缓存,同一个包虽然是多线程接收,但是同一时间只会有一个线程接收同一套接字,在一次交互过程中,你按顺序吧每次接收到的数据都添加到这个客户缓存里面做处理
[/Quote]

求老师写点代码,例如如何对每一个单独socket创建一个缓冲区?这个缓冲区大小?好多问题头疼
towriting 2011-08-18
  • 打赏
  • 举报
回复
太高深了,帮顶
内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络中的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出更快的收敛效率和更强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从事物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络中的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。

18,356

社区成员

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

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