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个字节!请问下各位老师,这怎么处理?如果方便请放代码便于小生理解。谢谢各位老师
...全文
255 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
  • 打赏
  • 举报
回复
太高深了,帮顶

18,356

社区成员

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

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