C++socket编程(六):6.1 设置socket的阻塞和非阻塞

在完成了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;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值