C++服务端长连接实现

前言:

    在网上找了很多Socket长连接的实现方式,但是自己拿过来用都有问题,为了解决这个问题,本人花了不少时间在上面。其实 socket 长连接很简单,就是连接后不断开即可。接下来,这里贴上实现的源码例子。本人做这个东西是为了在pc上运行的游戏,所以方法的实现是基于 window api 的,linux上的也大同小异。

    另外,本人也是刚实现不久,例如:心跳这些还没有去实现。如果在文章中发现什么问题,欢迎各路大牛指正。

 

 

    C++ 所需头文件:

#include <thread>
#include <functional>
#include <iostream>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

    首先就是C++代码 监听的代码(可以放到函数体内部):

// port 需要监听的端口
// listenCallback 一个客户端连接进入时,新建线程执行的方法
void ListenPort(unsigned short port, std::function<bool(SOCKET clientSocket)> listenCallback) {
    // 初始化 WSA
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA wsaData;
    if (WSAStartup(sockVersion, &wsaData) != 0) {
        std::cout << "WSAStartup error!" << std::endl;
        return;
    }

    // 创建套接字
    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (serverSocket == INVALID_SOCKET) {
        std::cout << "create socket error!" << std::endl;
        return;
    }

    // 绑定IP和端口
    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;
    if (bind(serverSocket, (LPSOCKADDR) &sin, sizeof(sin)) == SOCKET_ERROR) {
        std::cout << "bind error" << std::endl;
        return;
    }

    // 监听
    if (listen(serverSocket, 5) == SOCKET_ERROR) {
        std::cout << "listen error" << std::endl;
        return;
    }
    
    // 等待客户端连接
    SOCKET socketClient;
    sockaddr_in remoteAddr;
    int remoteAddrlen = sizeof(remoteAddr);
    while (true) {
        // 一个新的客户端连入
        clientSocket = accept(serverSocket, (SOCKADDR *) &remoteAddr, &remoteAddrlen);

        // 开启一个新的线程去给这个客户端发送消息
        std::thread clientConnectThread = std::thread(listenCallback, clientSocket);
        clientConnectThread.detach();
    }
}

到这这里,只是建立了一个socket的监听而已,并没有实现长连接。其实,是否长连接。取决于是否关闭客户端的socket(代码中的:clientSocket),只要不关闭socketClient 就可以一直不断地发送消息到客户端了。

 

回调函数的例子:


// 每 500ms 向客户端发送一次 "hello" 消息(如果客户端一秒接受一次的话,可能会接收到连续的字符串,如客户端接收一次可能是:"hellohello",由两次send的发送结果)
std::function<bool(SOCKET clientSocket)> listenCallback = [](SOCKET clientSocket) {
       while(true) {
           const char * buff = "hello";
           int len = strlen(buff);
           send(clientSocket, buff, len, 0);

           // 当前线程休眠 500ms
           std::this_thread::sleep_for(std::chrono::milliseconds(500));
       }

       // 关闭客户端 socket
       // closesocket(clientSocket);
    };

 

转载于:https://my.oschina.net/u/3496308/blog/1817111

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++实现Socket长连接可以通过以下步骤来完成: 1. 创建Socket:使用socket函数创建一个Socket对象,指定协议族、类型和协议。例如,可以使用AF_INET作为协议族,SOCK_STREAM作为类型,和IPPROTO_TCP作为协议。 2. 绑定Socket:使用bind函数将Socket绑定到一个特定的IP地址和端口号上。这样,Socket就可以监听来自该地址和端口的连接请求。 3. 监听连接请求:使用listen函数开始监听来自客户端的连接请求。可以指定一个队列的最大度,以限制同时处理的连接数。 4. 接受连接:使用accept函数接受客户端的连接请求,并返回一个新的Socket对象,用于与客户端进行通信。 5. 保持连接:在接受连接后,可以选择不关闭客户端的Socket,以实现长连接。这样,服务器和客户端之间可以持续地进行通信。 6. 数据传输:使用send和recv函数在服务器和客户端之间传输数据。可以根据具体需求,设计协议和消息格式来进行数据的发送和接收。 需要注意的是,长连接实现还需要考虑到网络异常、超时等情况,以保证连接的稳定性和可靠性。可以使用心跳机制、超时设置等方式来处理这些问题。 参考文献: \[1\] 引用来源:https://blog.csdn.net/qq_41453285/article/details/108759051 \[2\] 引用来源:https://blog.csdn.net/qq_41453285/article/details/108759051 #### 引用[.reference_title] - *1* *2* [C++服务端长连接实现](https://blog.csdn.net/weixin_28909441/article/details/117103249)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值