1

我正在编写一个在 LAN 上使用套接字玩的游戏。我使用 4 字节长度前缀来了解其余数据的数量,如下所示:

void trust_recv(int sock, int length, char *buffer)
{
    int recved = 0;
    int justRecv;

    while(recved < length) {
        justRecv = recv(sock, buffer + recved, length - recved, 0);
        if (justRecv < 0) return;

        recved += justRecv;
    }
}

void onDataArrival(int sock)
{
    int length;
    char *data;

    trust_recv(sock, 4, (char *) &length);
    data = new char[length];

    trust_recv(sock, length, data);
    do_somethings_with_data(data);
}

问题是如果有人(例如入侵者或黑客)发送其他格式的数据(可能只有 2 个字节或其余长度低于 4 个字节前缀值)或网络问题,我的应用程序将转到“不响应" 状态并且必须关闭(因为我使用阻塞套接字)。如何使我的套接字应用程序更灵活但不要将套接字切换到非阻塞模式来解决这个问题?(或者任何组织数据或算法的想法)

4

1 回答 1

0

您可以在套接字设置阶段使用setsockopt()调用和SO_RCVTIMEO参数设置接收超时;

struct timeval tv;

tv.tv_sec =8;
tv.tv_usec = 0 ;

if (setsockopt (your_sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) 
    perror(“setsockopt error”);

recv()然后测试和他的回报errno

if (justRecv < 0)
{
    if (errno == EAGAIN)
        perror("TIMEOUT!");
    return;
}    
于 2013-01-21T11:07:18.187 回答