我正在写一个带有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;状态并且必须关闭(因为我使用阻塞套接字)。如何使我的套接字应用程序更灵活,但不要将套接字切换到非阻塞模式以通过此问题? (或任何组织数据或算法的想法)
答案 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;
}