Sockets 柔性插座应用
我正在写一个用套接字在局域网上玩的游戏。我使用4字节长度前缀来知道剩余部分中有多少数据,如下所示: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);
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:谢谢,我会通知您的,谢谢您的回答,顺便问一下,还有其他方法解决这个问题吗?