Socket 客户端与服务端通信【心跳机制+断线重连】

这是一个关于Socket通信的示例,涵盖了心跳机制和断线重连功能。通过创建Server和Client类,实现了服务器监听、接受客户端连接、发送与接收心跳报文。当客户端3秒内未收到心跳包,会判断为服务端掉线并尝试重新连接;服务器端如果5次未收到心跳包则认为客户端已下线。
摘要由CSDN通过智能技术生成
直接上代码,让代码说话!
//Server.h
#pragma once
#include <stdio.h> 
#include <iostream>
#include <winsock2.h>
#include <map>
#pragma comment (lib, "ws2_32.lib") 
using namespace std;

#define SERVER_HOST	"XX.X.XX.XX"

enum Type { HEART, CTRL_INFO, OTHER};
//packet
struct PACKET
{
	//报文头
	Type type;
	//报文信息
	char msg[1024];
};

class Server
{
public:
	Server();
	//construction
	Server(string ip, int port);
	//deconstruction
	~Server();
	//
	void Bind();
	//
	void Accept();
	//
	void Listen(int queue_len);
	//
	void Recv();
	//
	void Run();
	//心跳线程入口函数
	static UINT HeartProc(LPVOID lparam);

private:

	sockaddr_in							m_serverAddr;
	//监听fd
	int								m_listen_fd;
	//最大监听fd
	int								m_max_fd;
	//超时信息
	timeval								m_timeout;
	//所有fd集合,包括监听fd和客户端fd   	
	fd_set								m_master_set;
	//工作集合
	fd_set								m_working_set;
	//Server Thread
	CWinThread*							m_serverThread;
public:

	//记录链接的客户端信息,链接、IP、未发送心跳次数
	map<int, pair<string, int> >		m_clientInfo;
};

//Server.cpp
#include "stdafx.h"
#include "Server.h"
#include <Ws2tcpip.h>

Server::Server(string ip, int port)
{
	m_serverThread = NULL;
	//
	WSADATA wsaData;
	// Initialize Windows socket library      
	WSAStartup(0x0202, &wsaData);
	//先将保存地址的server置为全0
	memset(&m_serverAddr, 0, sizeof(SOCKADDR_IN));
	//
	m_serverAddr.sin_family = AF_INET;
	m_serverAddr.sin_addr.s_addr = inet_addr(ip.c_str());
	m_serverAddr.sin_port = htons(port);
	// create socket to listen
	m_listen_fd = socket(PF_INET, SOCK_STREAM, 0);
	if (m_listen_fd < 0)
	{
		//AfxMessageBox为MFC中的提示对话框接口
		AfxMessageBox(_T("Create Socket Failed!"), MB_ICONINFORMATION);
		//exit(1);
	}
	else{}
	int opt = 1;
	//closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket
	setsockopt(m_listen_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt));
}

Server::Server()
{

}

Server::~Server()
{
	for (int fd = 0; fd <= m_max_fd; ++fd)
	{
		if (FD_ISSET(fd, &m_max_fd))
在C#中,构建一个完整的服务器客户端系统,包括心跳机制客户端断线重连功能,通常涉及以下几个步骤: **服务端(Server):** 1. **创建服务器端Socket实例:**首先创建一个TcpListener对象监听特定的IP地址和端口。 ```csharp TcpListener listener = new TcpListener(IPAddress.Any, Port); ``` 2. **开始监听连接:**启动监听并等待客户端连接。 ```csharp listener.Start(); ``` 3. **接收客户端连接:**当有客户端连接时,接受新的套接字并处理它们。 4. **心跳检测:**可以定期通过发送心跳包(如空数据包或特定标识符)来检查客户端是否还在线,如果长时间未收到响应,则认为客户端断开。 5. **心跳逻辑:**在发送心跳请求后,设置超时定时器,若未在预定时间内收到回应,则关闭连接并尝试重新连接。 **客户端(Client):** 1. **创建客户端Socket:**创建一个新的TcpClient对象,尝试连接到服务器。 ```csharp TcpClient client = new TcpClient(); client.Connect(ServerIpAddress, ServerPort); ``` 2. **发送和接收数据:**使用GetStream()获取Socket流进行双向通信。 3. **心跳发送和接收:**客户端也需要定期向服务器发送心跳,并处理从服务器接收到的心跳确认。 4. **重连逻辑:**如果客户端断线(例如网络中断),需要在适当的时候尝试重新连接,比如使用Timer或线程池任务。 **示例代码简化版:** ```csharp // 服务器端 while (true) { Socket client = listener.Accept(); // 创建新线程处理客户端请求 Task.Run(() => HandleConnection(client)); } // 客户端 using (TcpClient client = new TcpClient()) { client.Connect(ServerIpAddress, ServerPort); while (IsConnected(client)) { SendHeartbeat(client); ReceiveAndProcessMessage(client); } } ``` 请注意,这只是一个简化的版本,实际应用中需要考虑错误处理、线程同步以及更复杂的重试策略等细节。在客户端断线重连部分,`IsConnected()`函数用于判断连接状态,`SendHeartbeat()`和`ReceiveAndProcessMessage()`则是心跳和数据交换的抽象。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值