socket编程问题一二(200分)

  • 主题发起人 主题发起人 Sachow
  • 开始时间 开始时间
S

Sachow

Unregistered / Unconfirmed
GUEST, unregistred user!
阻塞/非阻塞 与TCP/UDP的关系?
阻塞式通讯是否特指的就是的在建立socket的时候选用TCP,非阻塞式就是选用UDP?还是TCP
也分阻塞/非阻塞方式?
目前我看到的一些有关socket读超时的处理方法都是基于数据报套接字的,而没有关于流
套接字的,但采用流套接字时只要服务器没有写入socket管道,客户端就一直等待,该如
何处理超时?简单地关闭该套接字吗?
 
阻塞/非阻塞 和 TCP/UDP没有关系
建议看书
 
我刚看到hellion的回复时很是忿忿,因为我急需的不是别人告诉我去看书,而是概要地讲解一
下。现在看过了书(时间也花了不少)心情平静了些,因为这个问题确实是由于我没有认真看书
而未搞懂。
现在让我们来仔细分析一下这个问题,由于我现在的工作要在UNIX下完成,所以我的讨论重点
是Berkeley套接字,由于Windows下的套接字也是按照Berkeley的标准来移植的,所以我们也
连带提一下Windows下的东西。
我看了一下VCL的源码,发现TCustomSocket(TClientSocket和TServerSocket的祖先)封装的
协议是IPPROTO_IP,采用的是流套接字,但而其默认的服务方式是非阻塞的,但其是调用了
WSAnsyXXX一类的API来实现(异步)非阻塞式通信的,在UNIX和Winsock API下用socket()建立
一个套接字时,默认是阻塞式,不管是流套接字还是数据报套接字,不管采用哪种协议族。在
UNIX下,非阻塞式通信的实现是一件非常麻烦的事情。
 
To :Sachow
你看的什么书?
告书我吧。
谢谢
 
首推 UNIX Network Programming 《UNIX网络编程 卷1:连网的API:套接字与XTI》
其次为《UNIX程序设计教程》
两书均为清华大学出版社出版。
(细心的读者会发现,后者在不少地方实际上用的是前者的例子,但加入了一些作者自己
的理解)
 
有钱的捧个捧钱(有没有啥能补充的),没钱的捧个人场,散分了。
 
哪位能详细讲一下阻塞/非阻塞 ,找了好几本书上都没有啊
另外,如果用D6的SocketServer和SocketClient,如果做像联众的游戏,
是不是网络和服务器资源占用非常大?
 
阻塞/非阻塞 和 TCP/UDP没有必然关系。
是TCP还是UDP是Sockke API中Socket函数中的参数决定的
若是UDP:
Socket(AF_INET, SOCK_DGRAM, 0);
若是TCP:
Socket(AF_INET, SOCK_STREAM, 0);
而且TCP和UDP的工作过程也有区别。
关于Socket API,在MSDN中有详尽的例子和帮助。
阻塞/非阻塞(Block/Nonblock.) 的差别以前的讨论中有不少,例如:
freecom (2001-11-8 11:22:00)
我的理解:阻塞模式是等停的一个连接的数据没有发送完毕,sever端就等在那里,不响应其他连接,这样的好处是
一对一传送较稳定client数据传送发应速度快,但每个连接服务器要创建一个线程,耗费系统资源多。
非阻塞模式不是等停的有点像cpu时间片轮转,可以轮流处理多个连接数据,可以用一个线程
处理多个连接,但如果连接较多单个的响应速度就会慢。

chrisn (2001-11-8 11:53:00)
说的再具体点

教父 (2001-11-8 12:02:00)
freecom说得也差不多了,阻塞就是任何操作都要等到结束了才会执行下一步,非阻塞则不
会等待而是直接执行下一步。
非阻塞方式是由于历史原因而被保留下来的,现在一般都采用阻塞方式。

heiniu (2001-11-8 14:18:00)
如果作为服务端,当要处理很多客户请求的时候就用非阻塞方式,否则建议用阻塞方式

 
WINSOCK工作模式只有二种, 就是阻塞跟非阻塞模型就有好几种, 比如:
阻塞下的SELECT, 异步WSAAsyncSelect, 重叠IO模型,完成端口重叠IO操作模型.
其中完成端口操作模型是最为高效率的模型, 适合用于高并发即时通讯服务器需求。
 
“完成端口重叠IO操作模型”是怎么说的?
 
http://www.delphibbs.com/delphibbs/dispq.asp?LID=838394
这个帖子上有我的回答
 
好!谢谢各位!
有没有对UNIX较熟的朋友?告诉我一声,下次我再遇到UNIX问题的时候,也来大富翁上提一下。
 
很多人说win32下用阻塞socket不好,本人不这么认为。我完全同意Indy的观点。
使用阻塞方式起码有几个好处:
1.代码容易移植到unix平台
2.书写Server程序可控性好,状态控制,事件发生先后次序,控制起来易如反掌。
3.代码可读性好
4.谁说用阻塞方式效率就低?不知指的是什么效率了。例子:纯win32下的IRC Server reference room VS Uinx移植过来的ircd,根本不具备可比性,pchome咋不用reference room来做IRC server
重叠IO等技术听起来固然好,可是要知道不是所有的网络应用都如Web Server般发送完就断开的,
如irc和mud server等保持连接并需要复杂状态控制的tcp/ip服务不用线程阻塞工作方式那控制起来的工作复杂程度是不可想象的。
应用程序的主要开销还是存在于具体应用上吧,一个复杂的应用逻辑能够从理论上节省一点点的系统开销,难道这样比较合算?
 
是啊,可移植性这一点对于我们来说很重要,因为我们的项目通常都不能在开发阶段确定要
采用的操作系统。(因为系统通常是运行在小型机上,而用户要直到签合同的时候才会选定
机型,所以系统要能比较方便的移植在各种UNIX下才行)
 
多人接受答案了。
 
后退
顶部