C语言 TCP客户端支持掉线重连

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <time.h>
#include <sys/select.h>
#include <errno.h>
#include <strings.h>
#include <sys/types.h>			/* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>			/* superset of previous */
#include <arpa/inet.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <netinet/tcp.h>

/**************************************************************************
**************************************************************************
*
* 主方法Main
	参数argv[1] :SERVER IP
	参数argv[2] :SERVER PORT
	
**************************************************************************
***************************************************************************/
int main(int argc, char **argv)
{	
	/* tcp相关参数 */
	char * msg = (char *) malloc(MSGLEN*sizeof(char));	//TCP报文申请内存
	struct sockaddr_in sin;
	struct tcp_info info;
	int len = sizeof(info);
	
reconnect:
	/* 掉线重连 */
	SystemInit(&fd , &sin , argv);			//	系统初始化
	
	if (connect (fd, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
		perror ("connect");
		close(fd);
		sleep(1);
		goto reconnect;
	}
	printf ("Client staring...OK!\n");

    while(1){

		/* 判断是否掉线 */
		getsockopt(fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len); 
		if((info.tcpi_state==TCP_ESTABLISHED));
		else 
		{ 
			printf("socket Reconnecting....\n"); 
			close(fd);
			sleep(1);
			goto reconnect;
		} 

		Client_Working(fd ,msg);
    }

	free(msg);
    return 0;
}


/***************************************************
* 系统初始化
***************************************************/
static void SystemInit(int *fd , struct sockaddr_in *sin , char **argv)
{

	/* 创建socket */	
	if ((*fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
		perror ("Error:socket");
		exit (1);
	}
	
	bzero(sin, sizeof(*sin));
	
	sin->sin_family = AF_INET;
	sin->sin_port = htons(atoi(argv[2]));
	
	if (inet_pton (AF_INET, argv[1], (void *)&sin->sin_addr) != 1) {
		perror ("Error:inet_pton");
		close(*fd);
		exit (1);
	}	

}

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言TCP客户端支持重连是指客户端程序能够在网络连接断开后自动重新建立连接,并且能够在重连成功后继续与服务器进行通信。在TCP客户端中,出现网络故障导致连接断开是非常常见的情况,这时如果没有重连机制,客户端将无法与服务器进行通信,影响程序的正常运行。 客户端重连的实现通常需要以下几个步骤: 1.检测网络连接状态:客户端需要定时检测与服务器的连接状态。如果发现连接断开,则需要进入重连状态。 2.关闭当前连接:在开始重连之前,客户端需要关闭当前的连接,释放资源。 3.尝试重新连接:客户端开始尝试重新连接服务器,这个过程可以循环进行直到连接成功,或者达到一定的重连次数。 4.恢复通信:连接成功后,客户端需要重新建立通信。这个过程中需要注意一些状态的恢复,例如已经发送但是未收到回复的数据需要重新发送。 在实现重连时,需要注意一些细节问题,例如重连频繁会导致系统相应变慢,因此需要适当设置重连间隔;重连次数过多会浪费资源,或者表明有更深层次的问题需要解决等。同时,在客户端的代码结构上需要考虑到重连的需求,定义合适的数据结构和函数接口,方便代码的组织和维护。 总之,重连机制是TCP客户端必不可少的功能,能够让客户端程序在网络异常的情况下保持稳定的运行状态,提高程序的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值