在完成了tcp的客户端和服务端的连接和数据通信之后,我们要想到下面的问题。超时处理,因为网络并不是可靠的,存在各种异常情况。我们如何判断并处理这种异常情况,就变得很重要了。
如下问题:如果我的客户端connect与服务端三次握手失败怎么半,超时时间有多长,如果超时时间有10s的话,那么我们的界面可能卡死10s,这对于一般用户来说时无法忍受的。
解决方法:我们在做connect的时候,可以要求他不要阻塞。我们可以让他1s之内连不上进行接下来的操作。我们可以进行超时处理。而且如果兼容跨屏的话,完全可以时用select,多路复用实现非阻塞。
如下客户端代码:
#include "XTcp.h"
int main()
{
XTcp client; //client创建之后要建立连接,第一步客户端和服务器都是一样的,
//区别是第二步,客户端有需要connect去连接服务器有一个三次握手的过程
client.CreateSocket();
client.SetBlock(true);
client.Connect("192.168.16.23", 8081);
client.Send("clientyesyesyes", 20);
char buffer[1024] = { 0 };
client.Recv(buffer,sizeof(buffer));
printf("%s\n", buffer);
return 0;
}
阻塞设置代码;
bool XTcp::SetBlock(bool isblock)
{
if (sock <= 0)
return false;
unsigned long ul = 0; //值为0,表示时阻塞模式
#ifdef WIN 32
if (!isblock)
ul = 1; //当你想把当前设为阻塞模式设为0,否则设为1
ioctlsocket(sock, FIONBIO,&ul);
#else
int flags = fcntl (sock, F_GETFL, 0); //第一个参数时socket,第二个参数获取它的属性
if (flags < 0)
return false;
if (isblock)
{
flags = flags &~O_NONBLOCK;
}
else
{
flags = flags | O_NONBLOCK;
}
if (fcntl(sock, F_SETFL, flags) != 0)
return false;
#endif
return true;
}