Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 柔性插座应用_Sockets_Network Programming_Network Protocols_Winsock2 - Fatal编程技术网

Sockets 柔性插座应用

Sockets 柔性插座应用,sockets,network-programming,network-protocols,winsock2,Sockets,Network Programming,Network Protocols,Winsock2,我正在写一个用套接字在局域网上玩的游戏。我使用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);

我正在写一个用套接字在局域网上玩的游戏。我使用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);
}
void trust\u recv(int sock,int length,char*buffer)
{
int recved=0;
int justRecv;
while(记录<长度){
justRecv=recv(sock,buffer+recved,length-recved,0);
如果(justRecv<0)返回;
recved+=justRecv;
}
}
无效onDataArrival(内部sock)
{
整数长度;
字符*数据;
信任记录(sock,4,(字符*)和长度);
数据=新字符[长度];
信任记录(袜子、长度、数据);
用数据做一些事情(数据);
}

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

您可以在套接字设置阶段,使用
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;
}    
if(justRecv<0)
{
if(errno==EAGAIN)
佩罗尔(“超时!”);
回来
}    

sizeof(int)
可能不是
4
。您应该使用
int32\u t
sizeof(length)
来防止堆栈损坏。@JamesMcLaughlin:谢谢,我会通知您的,谢谢您的回答,顺便问一下,还有其他方法解决这个问题吗?