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

socket中select函数求救

    来源: 互联网  发布时间:2015-07-23

    本文导语:  先简述一下问题: 我需要在linux下模拟windows中的异步IO模式的socket,用过WSAEventSelect和WSAEnumNetworkEvents两个函数的朋友应该对此很熟悉,我就是要模拟这两个函数,分别叫select_events, enum_events(封装在一个xsocket类中) 大体...

先简述一下问题:
我需要在linux下模拟windows中的异步IO模式的socket,用过WSAEventSelect和WSAEnumNetworkEvents两个函数的朋友应该对此很熟悉,我就是要模拟这两个函数,分别叫select_events, enum_events(封装在一个xsocket类中)

大体框架是:
使用select_events时创建一个线程,该线程负责监测socket事件并通知上层,其大致结构为:
while( 1 )
{
     fd_set rset, wset, eset;
     //.......
     ::select( pthis->m_sock+1 , &rset, &wset, &eset, NULL);
     if( FD_ISSET( pthis->m_sock, &rset ) ) { }
     if( FD_ISSET( pthis->m_sock, &wset ) ) { }
     if( FD_ISSET( pthis->m_sock, &eset ) ) { }
}

现在的问题是:
socket创建成功后,使用select对rset和wset检测时总是有效,也就是这个循环老是在跑,郁闷啊,应该怎么办?

|
if (select( pthis->m_sock+1 , &rset, &wset, &eset, NULL) > 0)
{
     if( FD_ISSET( pthis->m_sock, &rset ) ) { }
     if( FD_ISSET( pthis->m_sock, &wset ) ) { }
     if( FD_ISSET( pthis->m_sock, &eset ) ) { }
}

If socket have nothing to send, the wset is valid.

|
是在哪步以后select的呢? server端还是client端?
我试了下,server端在listen之后,accept之前调select是可以的,而且直到有client请求connect才会触发select的事件。

|
FD_SET( pthis->m_fds[0], &rset ); 有没有问题?

|
是不是前面初始化得不对?
先得 FD_ZERO( &rset );
然后再 FD_SET( listenfd, &rset );
select()完以后再判断。

|
应该是select最后一个参数的问题的吧,如果是NULL就表示要永远等待,直到其中某个描述符
准备好才中断此等待.
所以,如果你的rset和wset根本就没有准备好,那你的循环肯定是跳不出来的.

|
fd_set必须初始化啊。
没有把他们初始化为0,FD_ZERO()
根本不能保证这个集合是空的。具体依赖于实现

|
select > 0 有效 0 timeout

|
顶一下。

|
select 返回后,描述符集不会自动清零,得调用FD_ZERO

    
 
 

您可能感兴趣的文章:

  • socket编程:recv(...)函数问题求救
  • 求救:关于socket
  • {求救}socket编程处理udp广播
  • socket编程的问题,高分求救!!
  • 求救!有一个关于linux上的socket编程的问题要问问大家!
  • 如何利用socket传文件(不同格式的)?高分求救!!---在线等待
  • 高分求救:SOL_SOCKET,SO_RCVTIMO,SO_SNDTIMEO,IPPOTO_TCP,TCP_NODELAY这些是在哪个头文件定义的呢?
  • java Socket问题求救!!师兄师姐们救命阿!!!!
  • Socket传输中文字符处理!!高分求救
  • 菜鸟求救:多线程 多socket
  • 求救:Socket 通讯出现混乱,求网络编程高手!!!!!!
  • php使用socket_bind()函数绑定IP地址
  • 当进程处于socket读阻塞模式中,外部SIGNAL发生,此时信号相应响应函数可否进行socket写?
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • Linux 下用什么函数查找socket上一次的错误?
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 驱动模块中用socket,哪有相关的函数啊??
  • socket编程,使用recvfrom()函数监听问题。
  • socket函数源码
  • linux 如何用SOCKET设置函数设置阻塞和非阻塞?
  • 求linux下socket函数手册
  • 关于socket中write()函数的问题
  • 如何知道一个用有没有权限调用bind()函数(socket编程的时候)
  • 请问有没有Linux下SOCKET服务端和客户端的接口函数!!
  • socket send函数疑问,缓冲区
  • linux下socket的send函数阻塞问题?
  • [求助]请问socket编程中send()函数可以发送整形数据吗?
  • socket send()函数错误
  • 编译socket程序需要加什么库函数?
  • socket callback函数问题
  • 内核源文件/net/socket.c中调用其他模块的函数,该如何实现
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • socket通讯使用select的问题
  • socket select异常?
  • select和非阻塞socket的迷惑
  • socket编程select对accept的影响
  • 请教linux下管理多个socket用什么,难道只能用select?
  • 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一直返回超时的问题
  • 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定义及介绍


  • 站内导航:


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

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

    浙ICP备11055608号-3