当前位置:  技术问答>linux和unix

socket中的select模型问题

    来源: 互联网  发布时间:2016-08-10

    本文导语:  对select模型是有点理解,但我对select的异步机制还是不甚了解,在我看来既然是异步了那么就不需要开额外的线程,但从select的函数原型来看: int select( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct...

对select模型是有点理解,但我对select的异步机制还是不甚了解,在我看来既然是异步了那么就不需要开额外的线程,但从select的函数原型来看:
int select(
int nfds,
fd_set* readfds,
fd_set* writefds,
fd_set* exceptfds,
const struct timeval* timeout
);
如果说你设置了超时时间,并且网络数据并未返回,那么select函数就处于阻塞状态,既然是阻塞住了也意味着执行该函数的主线程被阻塞住了,为了避免这种情况就得额外开一个线程。可是既然承诺了异步那么就应该其内部帮我们做好这些工作,比方说叫我们注册一个回调函数之类,可是貌似没有这样的机制。

另外一个问题是:如果说我要主动关闭一个socket,我要如何和select函数进行配合以便能够优雅的关闭,而不是直接调用closesocket这样的函数进行粗暴干预。

另外初来咋到积分不是很多,请各位见谅!

|
1.select函数本身是blocking的,用来支持I/O多路复用,参数传入的file descriptor需要是non-blocking。
异步(asynchronous)和non-blocking是由区别的,异步具有通知机制,而non-blocking需要不断的去check,直到读到数据或写完数据。

2.不知道第二个问题是不是想主动从select退出,然后主动关闭socket
通常的做法是在select的file descriptor多增加一个自己的socket,比如socket pair的读端。当需要主动从select返回时,就可以主动向socket pair的写端写入数据就好了。

|
第一个问题,有这样的机制,异步IO
第二个问题,你可以用kill()给这个线程发一个信号,那么select会返回,然后就可以进行close了.

    
 
 

您可能感兴趣的文章:

  • LINUX平台下大型服务器程序开发应该用何种SOCKET模型?
  • socket编程模型,命令流处理问题
  • IT科技资讯 iis7站长之家
  • 基于TCP异步Socket模型的介绍
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • socket通讯使用select的问题
  • socket select异常?
  • select和非阻塞socket的迷惑
  • socket编程select对accept的影响
  • 请教linux下管理多个socket用什么,难道只能用select?
  • socket select()能否取得剩余时间
  • socket编程中的select问题
  • linux下用C写socket程序编程中的select里面的timeout的值的单位到底是什么?
  • 我做了个socket服务器,但是客户端接收数据的时候用select()函数????可接受不到
  • socket的select使用超时的问题
  • 【请教】Linux下用select()监测socket,是不是通常不去监测可写状态的?
  • 哪位高手给个unix系统下C语言socket+fork()+select()的例子?
  • 一个未连接的客户端socket套接字在select处的奇怪行为
  • 求助,关于linux下socket的select模式编程
  • socket编程中select()的用法,请给一个原代码!
  • 程序用socket和select导致ubuntu脱网
  • 服务器端关闭,客户端select 会一直可读, 读的长度是-1,怎么在不关闭客户端socket下,清除可读
  • socket中select函数求救
  • socket通信时,select一直返回超时的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3