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

请帮忙看一下,为什么Linux下 select 总返回 0,windows下就正常

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

    本文导语:  请帮忙看一下,为什么Linux下 select 总返回 0,windows下就正常。 void sock_manager_t::poll() {     vector::iterator it;     for (it = m_socks.begin(); it != m_socks.end(); )     {         if ((*it)->m_sock == -1 || (*it)->m_destr...

请帮忙看一下,为什么Linux下 select 总返回 0,windows下就正常。

void sock_manager_t::poll()
{
    vector::iterator it;
    for (it = m_socks.begin(); it != m_socks.end(); )
    {
        if ((*it)->m_sock == -1 || (*it)->m_destroyed)
        {
            m_socks.erase(it);
            sys_msg("sock_manager_t sock num : %d", m_socks.size());
            continue;
        }
        ++it;
    }
    if (m_socks.empty()) 
    {
        THREAD_SLEEP(1);
        return;
    }

    int cnt = m_socks.size();

    int tick = sys_tick();

    struct timeval tv;

    fd_set fdRead, fdWrite, fdExcept;

    int i, j, index, temp, max_fd;
    index = temp  = 0;

    int reader_num = 0;

    for (i = 0; i m_listening || p->m_connected)
            {
                FD_SET(p->m_sock, &fdRead);
            }
            if (p->m_connected || p->m_connectting)
            {
                FD_SET(p->m_sock, &fdWrite);
            }
            FD_SET(p->m_sock, &fdExcept);

            if (++index >= cnt) break;
        }

        int result = 0;
        result = select(max_fd + 1, &fdRead, &fdWrite, &fdExcept, &tv);
        if (result == 0) continue;
        if (result == SOCKET_ERROR)
        {
            //sys_msg("result == 0 ||result == SOCKET_ERROR");
            continue;
        }

        index = temp;

        for (j = 0; j m_sock, &fdRead))
            {
                if (p->m_listening)
                {
                    if (p->m_on_accept) p->m_on_accept(p, 0, p->m_param);
                }
                else if (p->m_connected)
                {
                    if (p->m_on_recv) p->m_on_recv(p, 0, p->m_param);
                }
                reader_num++;
            }

            // on_connect(ok)
            if (FD_ISSET(p->m_sock, &fdWrite))
            {
                if (p->m_connectting)
                {
                    bool is_ok = true;
/*
#ifdef LINUX 
                    // in linux should check again
                    int err, len, ret;
                    len = sizeof(err);
                    ret = getsockopt(p->m_sock, SOL_SOCKET, SO_ERROR, (char*)&err, (socklen_t*)&len);
                    if (ret != SOCKET_ERROR) 
                    {
                        if (err != 0) is_ok = false;
                    }
                    else
                    {
                        is_ok = false;
                    }
#endif    
*/                    
                    if (is_ok)
                    {
                        p->m_connectting = false;
                        p->m_connected = true;
                        if (p->m_on_connect) p->m_on_connect(p, 0, p->m_param);
                    }
                    else
                    {
                        p->m_connectting = false;
                        p->m_connected = false;
                        if (p->m_on_connect) p->m_on_connect(p, -1, p->m_param);
                    }
                }
                else if (p->m_connected)
                {
                    if (p->m_on_send) p->m_on_send(p, 0, p->m_param);
                }
            }

            // on_connect(error)
            if (FD_ISSET(p->m_sock, &fdExcept))
            {
                if (p->m_connectting)
                {
                    p->m_connectting = false;
                    p->m_connected = false;
                    if (p->m_on_connect) p->m_on_connect(p, -1, p->m_param);
                }
                else if (p->m_connected || p->m_listening)
                {
                    p->close();
                    if (p->m_on_close) p->m_on_close(p, -1, p->m_param);
                }
            }

            if (++index >= cnt) break;
        }

        if (index >= cnt) break;
    }

    if (reader_num == 0 && sys_tick() - tick m_listening || p->m_connected)
            {
                FD_SET(p->m_sock, &fdRead);  //它执行了吗?
            }
            if (p->m_connected || p->m_connectting)
            {
                FD_SET(p->m_sock, &fdWrite); //它执行了吗?
            }

    
 
 

您可能感兴趣的文章:

  • 没人帮忙吗?我想用JAVA编一个像WINDOW中的画图软件,现在出现了如下问题,请各位老哥老姐帮帮忙
  • 请问,windows2000如何支持jsp??? - 如果你是JSP高手,希望你可以帮忙!
  • 刚从windows转linux,请帮忙解决一简单问题
  • 关于Windows XP与Linux双系统的问题(有点急,请各位高手帮帮忙)
  • 我重装了WINDOWS可现在进不了LINUX了,怎么能够进去呢~~高手帮忙
  • 请大家帮忙提供资料:如何将windows系统服务程序移植为linux系统服务?
  • 请求帮忙!!我刚刚安装了LINUX,可是奇怪的是X WINDOW显示的画面在右下角出现。
  • 大家帮忙看一下关于window的小问题!
  • X Window进不进去了,麻烦各位,帮帮忙啊....
  • windows下vb开发的版本的软件,现在移植到linux下,一系列问题,大家帮忙,谢谢
  • 我的red hat 装上了 windows2000却看不见了? 请大侠帮忙!!(50分)
  • 请帮忙,我的WINDOWS98,开始中的"运行"被恶意删除,请问,怎么还原?谢谢
  • 怎么样才能使我新装的LINUX机器在局域网内和其他的WINDOWS系统互相访问,很急!请帮忙!
  • 急!急!急!有关Windows 与linux互访的问题,高手请帮忙!
  • windows代码遗址到linux下遇到的问题,请各位大虾帮忙!
  • Lilo不能引导Windows Advance Server,大虾帮忙。。
  • 上司给我一个linux的c++工程,习惯于windows的vc的我不知道如何找到入口。帮忙啊
  • 程序从linux 移植到 windows 出错,环境 mingw + msys ,帮忙看看吧。
  • 如何在linux下安装windows?高手进来帮忙啦
  • 代码在linux服务器上,如何在windows中直接编码,大家帮忙想个方案。
  • 请各位兄弟帮忙,在线等待,关于进程返回异常的捕获!!!!
  • SSL_connect返回的错误Resource temporarily unavailable,请大家帮忙,很急......
  • 嵌入式中,利用C语言操作SQLite数据库,查询没有数据返回,请大家帮忙看看哈
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 努力努力再努力,帮忙帮忙来帮忙!
  • 在servlet中有一个关于单引号输出的问题,请大家帮忙,帮忙,帮帮忙!!
  • 小问题,你一定能够帮忙!——菜鸟请求帮忙!!
  • 帮忙帮忙如何设置变量pathclass
  • 帮帮忙!SCO OpenServer 5.0.5 的root用户口令丢了,怎么找回来啊,帮帮忙!!!!!!
  • 我用smartupload组件遇到问题了,请帮忙!!
  • webmail问题,请高手帮忙!!!谁会使用IMP 3.0????!!!
  • 脚本问题,帮忙
  • 高手帮忙解释
  • 求教求教,shell问题...各位大哥,帮忙下
  • 关于程序移植,请知道的帮忙,分会加的
  • DELL服务器,安装RedHat EAS3.0,装完了,连不上SSH。。。。。哪位大虾帮忙!!急啊 !!!!
  • 关于聊天室的若干疑问!!!请各位大虾帮忙!
  • 有个问题?请帮忙!
  • 请求各位帮忙,关于绘制图像
  • 关于全选的问题大家帮忙看看~
  • 帮忙找个工作。
  • 请帮忙推荐几个下载java电子书的网站,35分献上!
  • 我怎么不能编译servlet?请帮忙!!!谢谢!!!
  • 请问谁有weblogic6.1sp1的crack??大大加分!!请多帮忙!!!


  • 站内导航:


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

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

    浙ICP备11055608号-3