灵活的插座应用

时间:2013-01-21 10:47:45

标签: sockets network-programming network-protocols winsock2

我正在写一个带有socket的局域网游戏。我使用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个字节的前缀值)或网络问题,我的应用程序将转到&#34;没有回应&#34;状态并且必须关闭(因为我使用阻塞套接字)。如何使我的套接字应用程序更灵活,但不要将套接字切换到非阻塞模式以通过此问题? (或任何组织数据或算法的想法)

1 个答案:

答案 0 :(得分: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;
}