一个关于Socket同步的问题

自由之眼 2003-09-29 06:26:47
是这样的.我采用的是非阻塞模型的连接方式(TCP/IP)
建立一个socket与服务器连接,并使用WSAAsyncSelect(slsocket, hWnd, WM_USER_ACCEPT, FD_ACCEPT)
将socket数据导入消息环进行处理.

现在的问题是:
当有大量的数据包从客户机上传出的时候,服务器在消息环中按顺序处理消息,但是如果服务器的处理消息速度较慢的时候就会出现丢包,
我做了LOG文件监控
发现
一秒钟如果有10个数据包传输的时候不会出现数据处理丢失
但是一秒钟有100个数据包传输的时候就会丢掉40多个,我怀疑不是丢掉的,而是处理不过来的.

请问怎样保持在非阻塞模式下的数据对应啊.因为这个工程对数据的对应要求很高.必须一一对应才行,但是不能使用阻塞模型
...全文
80 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由之眼 2003-10-15
  • 打赏
  • 举报
回复
up,请大家帮帮忙
自由之眼 2003-10-12
  • 打赏
  • 举报
回复
谢谢楼上的。
但是TCP/IP模式不是可以保证数据的完整性吗?现在的问题是如果我客户端想服务器端发送数据,如果服务器端不返回处理的结果,所有数据包都会被处理的。只要我返回服务器端处理结果就会出现有些数据丢失。
我做了单步执行,发现同时1000个用户进入的时候,服务器端的socket缓存都接受到了。
但是当我在服务器端发送数据的时候,socket的缓存似乎就会丢掉一些数据。造成所谓的丢包。
不知道我说明白没有。请教各位高手了。

这个问题只在大量数据同时涌入的时候出现。小数据量的时候不会出现
sevencat 2003-10-11
  • 打赏
  • 举报
回复
丢包是比较严重的。
我有次也碰到这种情况。
后来我改了一下逻辑,服务器收到包后返回一个包,
客户只有收到返回包后才发发新包不过这样效率太低了。

不然人为降低速度sleep(5)
最厉害的时候我可能丢几倍的包。

还有不知道你们有没有碰到过,假如100个SOCKET同时CONNECT(用SELECT和非阻塞)也会有一些连接失败的。
自由之眼 2003-10-11
  • 打赏
  • 举报
回复
WSAEventSelect?
但是TCP/IP是保证数据发送的啊。我怀疑可能不是数据包的问题,而是缓存的问题。
在大量交换缓存数据的时候是不是会出现这样的问题?(在大量接受的时候还在大量发送)
请问这个问题是不是由于socket缓存造成的?
xiaohyy 2003-10-11
  • 打赏
  • 举报
回复
消息是有这个问题,当大量的消息涌入会丢失一些

建议楼主改用WSAEventSelect或重叠io模型
自由之眼 2003-10-11
  • 打赏
  • 举报
回复
up
是这样的。
我做了一个测试。
如果1000个数据封包从客户端传到服务器上的时候,如果我不作回应处理(就是说每处理一个封包就想客户端send一个处理结果),1000个数据包都会被处理。
但是如果我每处理一个封包就回复的话(就是send一个处理结果),这时候不知怎么回事就会出现客户端有些封包没有被处理的情况。
不知道大家遇到过没有。请教大家了
自由之眼 2003-09-30
  • 打赏
  • 举报
回复
但是现在的程序大部分都是这样写的啊.
所以想请教一下怎样对付这样的情况.在这里谢谢了先
chineseoldghost 2003-09-30
  • 打赏
  • 举报
回复
可不可以使用winproc不进行数据的处理而是只将数据转存到一个链表中,然后单独开一个线程对数据进行处理,这样丢包的可能性可能会降低,或者干脆不使用WSAAsyncSelect模型而使用重叠io模型
danfeng 2003-09-29
  • 打赏
  • 举报
回复
你处理的有问题

18,355

社区成员

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

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