在完成了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("%sn", 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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)