TCP实现断开重连

//服务端程序
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <inttypes.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <errno.h>

#define COUNTOF(x)  (sizeof(x)/sizeof(*x))
#define PORT 5566
#define SIZE 10

typedef struct server_context_st
{
	int count;
	int clifds[SIZE];
	fd_set allfds;
	int maxfd;
}server_context_st;

int main()
{
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	server_context_st server;
	char msg[1024] = "";
	const char* str = "datakkkkkkkk";
	
	
	int sockfd = -1;
	if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1)
	{
		fprintf(stderr, "socket create failed");
		return -1;
	}
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if(bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1)
	{
		perror("bind failed.");
		return -1;
	}
	
	listen(sockfd, 5);
		
	int sClient;
	struct sockaddr_in remoteAddr;
	int nAddrlen = sizeof(struct sockaddr);
ACCEPT:
	printf("acceptting....\n");
	sClient = accept(sockfd, (struct sockaddr*)&remoteAddr, &nAddrlen);
	if(sClient == -1)
	{	
		perror("accept error!");
		return -1;					
	}
	printf("accept a socket:(%s:%d)\n", inet_ntoa(remoteAddr.sin_addr), remoteAddr.sin_port);
		
	FD_ZERO(&server.allfds);
	FD_SET(sClient, &server.allfds);
	
	struct timeval timeout = {0, 500};
	server.clifds[server.count++] = sClient;
	
	server.maxfd = sClient;
	
	
	while(1)
	{
		fd_set readSet, writeSet;
		FD_ZERO(&readSet);
		readSet = server.allfds;
		FD_ZERO(&writeSet);
		writeSet = server.allfds;
		
		int total = select(server.maxfd+1, &readSet, &writeSet, NULL, &timeout);
		if(total == -1)
		{
			continue;
		}
		
		for(int i = 0; i < server.count; i++)
		{
			int ss = server.clifds[i];
			
			if(FD_ISSET(ss, &readSet) != 0)
			{									
				int recvBytes = recv(ss, msg, COUNTOF(msg), 0);
				if(recvBytes == -1 || recvBytes == 0)
				{
					close(ss);
					FD_CLR(ss, &server.allfds);
					printf("disconnect a socket.\n");
					server.count = 0;
					goto ACCEPT;
				}
				else 
				{
					printf("%s\n", msg);
					bzero(msg, sizeof(msg));
				}								
				
			}			
			
		}
	}
	
	close(sockfd);
	close(sClient);
	return 0;
}

//客户端发送数据
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <inttypes.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <errno.h>


#define PORT 5566

int main()
{
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	
	int sockfd = -1;
	if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1)
	{
		perror("socket create failed");
		return -1;
	}
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = inet_addr("10.10.63.70");
	if(connect(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1)
	{
		perror("connect server failed\n");
		return -1;
	}
	char chs[512] = "";
	ssize_t nbytes = 0;
	
	while(1)
	{
		scanf("%s", chs);
		nbytes = send(sockfd, chs, strlen(chs), 0);
		if(nbytes < 0)
		{
			fprintf(stderr, strerror(errno));
			break;
		}
		printf("send %d bytes.\n", nbytes);
		memset(chs, 0, sizeof(chs));		
	}
	close(sockfd);
	return 0;	
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解关于使用 Go 语言实现 TCP 断线重连的方法。在 Go 中,可以使用 net 包来实现 TCP 连接和断开连接的操作。在实现 TCP 断线重连时,可以通过实现一个循环来等待连接并且处理连接中断的情况。 以下是一个简单的示例代码,用于演示如何在 Go 中实现 TCP 断线重连: ```go package main import ( "fmt" "net" "time" ) func main() { conn, err := net.Dial("tcp", "localhost:8000") if err != nil { fmt.Println("Connection error:", err) return } for { if _, err := conn.Write([]byte("Hello, world!")); err != nil { fmt.Println("Write error:", err) conn.Close() break } time.Sleep(time.Second) buffer := make([]byte, 1024) if _, err := conn.Read(buffer); err != nil { fmt.Println("Read error:", err) conn.Close() break } fmt.Println(string(buffer)) } } ``` 在这个例子中,我们使用 net.Dial 来连接本地的一个 TCP 服务器。也可以替换为实际的服务器端地址。然后,我们通过一个简单的循环来处理连接中断并且尝试重新连接。在循环中,我们使用 conn.Write 来发送数据,如果发送失败,则关闭连接来断线重连。然后我们使用 conn.Read 来读取数据,如果读取失败,则关闭连接并且重新连接。循环会一直执行,直到应用程序被结束为止。 请注意,上面的示例代码仅用于演示如何在 Go 中实现 TCP 断线重连。在实际的应用程序中,你需要警惕一些细节问题,例如最大连接失败次数等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值