免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14810 | 回复: 9
打印 上一主题 下一主题

Socket异步通信问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-31 11:18 |只看该作者 |倒序浏览
请问一下,服务端如果采用异步Socket通信,采用事件的方式来完成,当有数据到来时,用事件通知并处理。
例如
void OnData()
{
    // Handle data
    ProcessData();
    SendResponse();
    ReceiveData();
}

当处理完数据后,继续接收数据。问题是,在Handle data的过程中,处理完数据后会调用SendResponse()向客户端异步发送数据,那么如果在下一次数据到来的时候,上一次SendResponse()的异步发送还没有完成(比较耗时的操作),那么现在新的数据到来又会导致一次SendResponse()的异步发送数据,这样如果异步发送的数据比较耗时,会不会“堆积”很多的异步发送操作,导致性能问题?

论坛徽章:
0
2 [报告]
发表于 2009-07-31 11:36 |只看该作者

回复 #1 loveddie 的帖子

特别耗时的话,会出现接收的数据堆在接收缓冲里,导致对方也没法给你发送过来数据。

论坛徽章:
0
3 [报告]
发表于 2009-07-31 11:38 |只看该作者
TCP?UDP?
具体是哪一种模型?
只从这几个函数看不出有什么性能问题。
一个好的设计也不会在这里有性能问题,顶多是吃了内存

论坛徽章:
0
4 [报告]
发表于 2009-07-31 11:47 |只看该作者
是TCP的。
就是考虑问题会不会出现在异步发送上,如果异步发送本身比较耗时,那么当数据接收事件被触发后又会进行一次异步发送,而由于上一次的异步发送还没有完成,从而会导致同时存在过多异步发送线程,如果客户端并发比较大的话,这种异步发送就会“堆积”得越来越多。

论坛徽章:
0
5 [报告]
发表于 2009-07-31 12:01 |只看该作者

回复 #4 loveddie 的帖子

要是数据一点都不能丢,就得增加存储,另外,处理要并发进行,实在不行就得有丢弃机制。

论坛徽章:
0
6 [报告]
发表于 2009-07-31 12:19 |只看该作者
嗯,我也想这个思路应该是通的了。问题可能要留到具体的业务逻辑里去解决(降低耗时操作,设计应用层的流量控制等手段),而不是通信模型本身。

论坛徽章:
0
7 [报告]
发表于 2009-07-31 12:50 |只看该作者

回复 #5 urapple 的帖子

tcp有滑动窗口,怎么会丢数据?至少在协议层不会丢数据

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
8 [报告]
发表于 2009-07-31 13:43 |只看该作者
可以加一个发送队列 发送线程如果发现发不出去 就把数据加到发送队列里 当可写事件发生的时候再发送这些数据

论坛徽章:
0
9 [报告]
发表于 2009-07-31 13:50 |只看该作者
原帖由 loveddie 于 2009-7-31 11:47 发表
是TCP的。
就是考虑问题会不会出现在异步发送上,如果异步发送本身比较耗时,那么当数据接收事件被触发后又会进行一次异步发送,而由于上一次的异步发送还没有完成,从而会导致同时存在过多异步发送线程,如果 ...


异步发送用线程来搞,一次发送启一个线程么?多个线程写一个 socket 的话线程之间不是还得保护同步么,否则数据岂不都写乱了,那跟单线程还有什么区别。
为何不用非阻塞 socket + 可写信号 + 数据队列的方式呢

论坛徽章:
0
10 [报告]
发表于 2009-07-31 17:29 |只看该作者

回复 #5 urapple 的帖子

同意。实在处理不过来就得增加丢弃机制。
这种情况我也碰到过。
总之,不论怎样,不能让数据都堆在网卡里,搞得对方也发布过来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP