【问题标题】:setting timeout for socket recv TCP为套接字接收 TCP 设置超时
【发布时间】:2016-04-27 15:08:45
【问题描述】:

我找到了一些关于如何操作的提示,但我不明白如何使用 setsockopt。我有一个无限的while循环调用recv,如果客户端在5秒内没有发送任何东西,我想超时和close(cli_socket)

如果客户只发送整个预期消息的一部分,我想重置计时器并再给他 5 秒。

当前我有这个:

while((cut = buffer.find("\r\n")) == -1)
        {
            struct timeval tv;
            tv.tv_sec = 5;
            setsockopt(cli_socket, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval));
            recv(cli_socket, tmpBuffer, 100, 0);
            buffer += tmpBuffer;
            memset(tmpBuffer, 0, 100);
        }

【问题讨论】:

  • 你的setsockopt 电话对我来说似乎没问题,它对我有用。您看到了什么行为,它与您的预期有何不同?我确实注意到您没有检查来自 recv() 的返回值,这确实让我想知道如果超时会发生什么。
  • 如果连接超时,我想关闭连接

标签: c sockets


【解决方案1】:

如果是EAGAINEWOULDBLOCK,您应该测试recvbreak 循环的返回:

EAGAIN 或 EWOULDBLOCK
套接字被标记为非阻塞并且接收操作将阻塞,或者已设置接收超时并且在接收数据之前超时已过期

struct timeval tv = {5, 0};
setsockopt(cli_socket, SOL_SOCKET, SO_RCVTIMEO, (struct timeval *)&tv, sizeof(struct timeval));

while((cut = buffer.find("\r\n")) == -1)
{
    int numBytes = recv(cli_socket, tmpBuffer, 100, 0));

    /// Edit: recv does not return EAGAIN else, it return -1 on error.
    /// and in case of timeout, errno is set to EAGAIN or EWOULDBLOCK

    if (numBytes <= 0)
    {
        // nothing received from client in last 5 seconds
        break;
    }

    buffer.append(tmpBuffer, numBytes);
}

你也可以使用select函数,使用起来并不复杂:

while((cut = buffer.find("\r\n")) == -1)
{
    timeval timeout = { 5, 0 };
    fd_set in_set;

    FD_ZERO(&in_set);
    FD_SET(cli_socket, &in_set);

    // select the set
    int cnt = select(cli_socket + 1, &in_set, NULL, NULL, &timeout);

    if (FD_ISSET(cli_socket, &in_set))
    {
        int numBytes = recv(cli_socket, tmpBuffer, 100, 0));
        if (numBytes <= 0)
        {
            // nothing received from client
            break;
        }

        buffer.append(tmpBuffer, numBytes);
    }
    else
    {
        // nothing received from client in last 5 seconds
        break;       
    }
}

【讨论】:

猜你喜欢
  • 2012-04-20
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2012-11-25
  • 2012-03-08
  • 1970-01-01
相关资源
最近更新 更多