Darwin中socket接收前使用select等待

Darwin中socket接收前使用select等待

编者:李国帅

qq:9611153 微信lgs9611153

时间:2013-7-4 13:01:46

背景原因:

因为darwin rtsp项目中所有的socket都是用了非阻塞模式,所以发送和接收不需要使用select,直接调用send和recv即可。

但是如果无数据,会发现出现近乎死循环的行为。

 

OS_Error Socket::Read(void *buffer, const UInt32 length, UInt32 *outRecvLenP)

OS_Error UDPSocket::RecvFrom(uSockAddr& outRemoteAddr,void* ioBuffer, UInt32 inBufLen, UInt32* outRecvLen)

看来还必须在recv或者recvfrom出现阻塞之前,使用select等待一下,但是等待的时间必须要小。

 

所需资源:

Vc socket

 

接收前的等待:

 

    //iMode = 1;//设置非阻塞方式连接

    //iMode= 0 ; //可以根据实际情况考虑 再设回阻塞模式

    int err = ::ioctlsocket(fFileDesc, FIONBIO, &iMode);

 

    int ret = 0;

    fd_set fdRecv;

    FD_ZERO(&fdRecv);

    FD_SET(fFileDesc, &fdRecv);//don't forget to error check the connect()!

 

    struct timeval toRecv ; //select 模型,即设置超时

    toRecv.tv_sec = 0;

    toRecv.tv_usec = 1000;//1毫秒;

    ret = select(0, &fdRecv, 0, 0, &toRecv);

    FD_CLR(fFileDesc, & fdRecv);

 

    if(ret == SOCKET_ERROR)//失败

    {

        *outRecvLen = 0;

        nlasterr = OSThread::GetErrno();

 

        if (nlasterr != EINPROGRESS && nlasterr != EINTR)

        {

            if((this->IsConnected()))

            {

                CNetLog::printlog(_T("%s ~kConnected for ::select error. GetErrno=%d\n"),__FUNCTIONT__,nlasterr);

                fState ^= kConnected;//turn off connected state flag

            }

            return (OS_Error)nlasterr;

        }

        else

        {

            return OS_NoErr;//socket并没有出错,可以继续。

        }

    }

    else if(ret == 0)

    {

        //CNetLog::printlog(_T("%s select timeout\n"),__FUNCTIONT__);

        *outRecvLen = 0;

        nlasterr = (OS_Error)EINPROGRESS;//超时

 

        return nlasterr;

    }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值