首页
社区
课程
招聘
[转帖]Winsock如何支持读超时
发表于: 2008-4-29 08:49 4987

[转帖]Winsock如何支持读超时

2008-4-29 08:49
4987
Winsock有个独有SO_RCVTIMEO选项:

--------------------------------------------------------------------------
int i   = timeout;

if
(
    SOCKET_ERROR == setsockopt
    (
        s,
        SOL_SOCKET,
        SO_RCVTIMEO,
        ( char * )&i,
        sizeof( i )
    )
)
{
    ... ...
}
--------------------------------------------------------------------------

如果碰上不支持SO_RCVTIMEO选项的情形,还可以利用select()实现读超时:

--------------------------------------------------------------------------
static int recv_with_timeout
(
    SOCKET          s,
    char FAR       *buf,
    int             len,
    int             flags,
    unsigned int    timeout
)
{
    int             error;
    fd_set          rset,
                    eset;
    struct timeval  tv;
    int             ret = SOCKET_ERROR;

    FD_ZERO( &rset );
    FD_ZERO( &eset );
    FD_SET( s, &rset );
    FD_SET( s, &eset );
    tv.tv_sec   = timeout;
    tv.tv_usec  = 0;
    error       = select( 0, &rset, NULL, &eset, timeout ? &tv : NULL );
    if ( SOCKET_ERROR == error )
    {
    }
    else if ( 0 == error )
    {
    }
    else if ( FD_ISSET( s, &rset ) )
    {
        ret = recv( s, buf, len, flags );
    }
    else
    {
    }
    return( ret );
}  /* end of recv_with_timeout */
--------------------------------------------------------------------------

Q: 系统支持SO_RCVTIMEO选项,但实测下来读超时没有生效。

A: scz@nsfocus 2006-10-10 14:44

检查一下如何创建套接字的,要确保在重叠套接字上使用SO_RCVTIMEO选项:

--------------------------------------------------------------------------
SOCKET  s;

#if 1
s   = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
#else
s   = WSASocket
(
    PF_INET,
    SOCK_STREAM,
    IPPROTO_TCP,
    NULL,
    0,
    WSA_FLAG_OVERLAPPED
);
#endif
if ( INVALID_SOCKET == s )
{
    ... ...
}
--------------------------------------------------------------------------

非重叠套接字(non-overlapped socket)上SO_RCVTIMEO选项无效。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
蛋蛋辛苦了啊,不过貌似这些东西在任何一个网络编程手册上都有的吧.....
2008-4-30 00:13
0
游客
登录 | 注册 方可回帖
返回
//