同步Socket编程的两个基本问题

Manboy 2000-04-19 08:47:00
一,MSDN介绍,当OnReceive等消息触发后,在Receive或send时,Socket将转为同步方
式,其余socket的消息将排队等候(不知道我的理解对不对).
如果这样的话,当用户较多时而网络速度较慢,是不是会使排队消息过多,程序响应
太慢?

二,MFC Socket使用的是异步方式,是不是Sent等函数都是立即返回?如果立即返回
的话,那么这时数据应该并未真正发送成功,只是在缓存中,如何才能确定它已经发
送成功了或是如何知道发送失败了呢? 如果不是立即返回,那么网络速度慢的时候
,是不是会使用户界面反应太慢呢?

另外,在windows下设计这种对多client的server程序,从程序质量上讲是使用mfc
socket的异步方式加消息响应好,还是用winsocket的同步方式好呢?
...全文
278 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
telan 2000-05-09
  • 打赏
  • 举报
回复
1.一个OnReceive函数中只能处理发生在一个Socket上的一次Receive事件.
2.每个Socket是各自不受干扰的;
3.消息不会丢失.
trace 2000-04-28
  • 打赏
  • 举报
回复
请教telan:
你所说的“在操作该SOCKET时,其他消息是没有机会处理的”,是不是指一个OnReceive函数中只能处理发生在一个Socket上的一次Receive事件?一般在OnAccept中会为每个被接受的连接建立一个Socket,以用来收发数据,假如首先接收了10个连接,然后这10个连接的client同时发送数据,那么每个Socket是否会各自不受干扰的调用各自的OnReceive?
又假设只建立了一个连接,该连接的Client端发送数据过快,或者OnReceive中有耗时的阻塞函数,以至一个OnReceive还尚在处理中,又来了若干个OnReceive消息,那么这些消息是否会丢失?
真不好意思一次问了这么多,这些问题都困扰了我很久,那位能指点一二,不胜感激!
Manboy 2000-04-22
  • 打赏
  • 举报
回复
我没看过TCP/IP具体实现的书,所以我有个问题:
winsocket在实现时是不是每个socket都有各自的buffer,send是向各自的buffer中发送数据,而实现TCP/IP的程序在各个buffer中抽取数据往外发,而不是发完一个再发另外一个,因为这样的话,会因某个链接过慢而影响其他连接的数据发送.
不知是不是这样?
您说的异步加多线程,能说详细点吗?在辅助线程中是不能响应消息的.
您是不是指在辅助线程中send,然后根据send返回的错误码判断是否重新发送或是给出连接已断的判断.
telan 2000-04-21
  • 打赏
  • 举报
回复
1、在ONRECIVE消息触发之后,这时你进行的读取数据操作肯定成功,当然这个时候是没法进行其他操作的,也就是说,虽然可以等待多个SOCKET的消息来到,但一旦某一个消息到来时,你在操作该SOCKET时,其他消息是没有机会处理的,这也是采用异步的缺陷,对于用户很多的情形,当然是要排队等候了,有的当然就响应很慢了。可以采取多线程和异步结合起来,每个线程只处理几个SOCKET,一旦SOCKET多了,就开新的线程,这样效率就较高。

2.采取异步方式,实际上情形是这样的:
发送数据时调用SEND函数,如果成功,当然就立即返回了;如果不能成功,也将立即将返回错误WSAWOULDBLOCK(或其他错误),这时就应该采用异步方式,等待FD…WRITE消息的到来,就可以重新调用SEND函数发送。读取数据时,等待FD…READ消息,来了再读。在读取和发送时,是有些区别的,主要是FD…WRITE消息通知机制有特殊之处。

多CLIENT程序,到底是异步还是同步,要根据情况来处理,同步和多线程是比较容易掌握和控制的,异步则稍微复杂一些。


Sniper 2000-04-20
  • 打赏
  • 举报
回复
关注

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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