windows TCP client demo

windows Webrtc +VS2019 (M124)下载编译以及调通测试demo windows webrtc 下载编译 阅读详情

TcpClient.h

#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <vector>

// 引入静态链接库
#pragma comment(lib, "ws2_32.lib")

class TcpClient {
public:
    TcpClient();
    ~TcpClient();

    // 连接到指定服务器
    bool connectToServer(const char* serverIp, int port);

    // 发送数据,非阻塞方式
    int sendData(const char* data, int dataLength);

    // 接收数据,非阻塞方式
    int receiveData(char* buffer, int bufferSize);

    // 启动心跳包机制,参数为心跳间隔时间(单位:秒)
    void startHeartbeat(int interval);

    // 停止心跳包机制
    void stopHeartbeat();

private:
    SOCKET clientSocket;
    bool isHeartbeatRunning;
    int heartbeatInterval;
    HANDLE heartbeatThreadHandle;

    // 发送心跳包的函数(需要定义为静态函数,以便在线程函数中调用)
    static DWORD WINAPI SendHeartbeat(LPVOID lpParam);

    // 辅助函数,用于非阻塞模式下完整发送数据
    int sendAllData(const char* data, int dataLength);
    // 辅助函数,用于非阻塞模式下完整接收数据
    int receiveAllData(char* buffer, int bufferSize);
};

#endif

TcpClient.cpp

#include "TcpClient.h"

// 构造函数,初始化客户端套接字
TcpClient::TcpClient() : clientSocket(INVALID_SOCKET), isHeartbeatRunning(false), heartbeatInterval(0),
heartbeatThreadHandle(NULL) {
    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        std::cerr << "WSAStartup failed: " << result << std::endl;
    }
}

// 析构函数,关闭套接字并清理WinSock环境
TcpClient::~TcpClient() {
    if (clientSocket != INVALID_SOCKET) {
        closesocket(clientSocket);
    }
    stopHeartbeat();
    WSACleanup();
}

// 连接到指定服务器
bool TcpClient::connectToServer(const char* serverIp, int port) {
    clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "Socket creation failed: " << WSAGetLastError() << std::endl;
        return false;
    }

    // 设置套接字为非阻塞模式
    u_long iMode = 1;
    int result = ioctlsocket(clientSocket, FIONBIO, &iMode);
    if (result == SOCKET_ERROR) {
        std::cerr << "ioctlsocket failed: " << WSAGetLastError() << std::endl;
        closesocket(clientSocket);
        return false;
    }

    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(port);
    result = inet_pton(AF_INET, serverIp, &serverAddr.sin_addr);
    if (result <= 0) {
        std::cerr << "Invalid server IP address" << std::endl;
        closesocket(clientSocket);
        return false;
    }

    result = ::connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));
    if (result == SOCKET_ERROR) {
        if (WSAGetLastError() != WSAEWOULDBLOCK) {
            std::cerr << "Connect to server failed: " << WSAGetLastError() << std::endl;
            closesocket(clientSocket);
            return false;
        }
    }

    // 使用select等待连接完成
    fd_set writefds;
    FD_ZERO(&writefds);
    FD_SET(clientSocket, &writefds);
    struct timeval timeout;
    timeout.tv_sec = 5;  // 设置超时时间为5秒,可根据实际调整
    timeout.tv_usec = 0;
    result = select(clientSocket + 1, NULL, &writefds, NULL, &timeout);
    if (result == SOCKET_ERROR) {
        std::cerr << "Select failed while waiting for connection: " << WSAGetLastError() << std::endl;
        closesocket(clientSocket);
        return false;
    }
    else if (result == 0) {
        std::cerr << "Connection timeout" << std::endl;
        closesocket(clientSocket);
        return false;
    }

    return true;
}

// 发送数据,非阻塞方式
int TcpClient::sendData(const char* data, int dataLength) {
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "Client socket is not valid, cannot send data" << std::endl;
        return SOCKET_ERROR;
    }
    return sendAllData(data, dataLength);
}

// 接收数据,非阻塞方式
int TcpClient::receiveData(char* buffer, int bufferSize) {
    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "Client socket is not valid, cannot receive data" << std::endl;
        return SOCKET_ERROR;
    }
    return receiveAllData(buffer, bufferSize);
}

// 启动心跳包机制,参数为心跳间隔时间(单位:秒)
void TcpClient::startHeartbeat(int interval) {
    if (isHeartbeatRunning) {
        return;
    }
    isHeartbeatRunning = true;
    heartbeatInterval = interval;
    // 创建线程,传入当前对象指针作为参数,线程启动函数为 SendHeartbeat
    heartbeatThreadHandle = CreateThread(NULL, 0, SendHeartbeat, this, 0, NULL);
    if (heartbeatThreadHandle == NULL) {
        isHeartbeatRunning = false;
        std::cerr << "Create heartbeat thread failed: " << GetLastError() << std::endl;
    }
}

// 停止心跳包机制
void TcpClient::stopHeartbeat() {
    isHeartbeatRunning = false;
    if (heartbeatThreadHandle != NULL) {
        // 等待线程结束
        WaitForSingleObject(heartbeatThreadHandle, INFINITE);
        CloseHandle(heartbeatThreadHandle);
        heartbeatThreadHandle = NULL;
    }
}

// 发送心跳包的函数(静态成员函数)
DWORD WINAPI TcpClient::SendHeartbeat(LPVOID lpParam) {
    TcpClient* client = static_cast<TcpClient*>(lpParam);
    const char* heartbeatData = "HEARTBEAT";  // 简单的心跳包内容,可自定义
    int dataLength = strlen(heartbeatData);
    while (client->isHeartbeatRunning)
    {
        if (client->clientSocket != INVALID_SOCKET)
        {
            int sentBytes = client->sendAllData(heartbeatData, dataLength);
            if (sentBytes == SOCKET_ERROR)
            {
                // 发送心跳包失败,可以在这里添加相应的处理逻辑,比如尝试重连等
                std::cerr << "Send heartbeat failed: " << WSAGetLastError() << std::endl;
            }
            else
            {
                // 尝试接收服务器对心跳包的响应
                char responseBuffer[10] = {0};
                int receivedBytes = client->receiveAllData(responseBuffer, sizeof(responseBuffer));
                if (receivedBytes <= 0) {
                    // 没收到响应或者接收出错,可认为连接可能有问题,添加相应处理逻辑
                    std::cerr << "No response for heartbeat, connection may be broken" << std::endl;
                }
                else
                {
                    std::cout << responseBuffer << std::endl;
                }
            }
        }
        // 使用 Sleep 函数替代 std::this_thread::sleep_for,单位是毫秒,所以要换算成毫秒
        Sleep(client->heartbeatInterval * 1000);
    }
    return 0;
}

// 辅助函数,用于非阻塞模式下完整发送数据
int TcpClient::sendAllData(const char* data, int dataLength) {
    int totalBytesSent = 0;
    while (totalBytesSent < dataLength) {
        int bytesSent = ::send(clientSocket, data + totalBytesSent, dataLength - totalBytesSent, 0);
        if (bytesSent == SOCKET_ERROR) {
            if (WSAGetLastError() == WSAEWOULDBLOCK) {
                // 暂时无法发送,等待下次尝试
                continue;
            }
            return SOCKET_ERROR;
        }
        totalBytesSent += bytesSent;
    }
    return totalBytesSent;
}

// 辅助函数,用于非阻塞模式下完整接收数据
int TcpClient::receiveAllData(char* buffer, int bufferSize) {
    int totalBytesReceived = 0;
    while (totalBytesReceived < bufferSize) 
    {
        int bytesReceived = ::recv(clientSocket, buffer + totalBytesReceived, bufferSize - totalBytesReceived, 0);
        if (bytesReceived == SOCKET_ERROR)
        {
            if (WSAGetLastError() == WSAEWOULDBLOCK)
            {
                // 暂时无数据可读,等待下次尝试
                continue;
            }
            return SOCKET_ERROR;
        }
        else if (bytesReceived == 0)
        {
            // 客户端关闭连接
            return totalBytesReceived;
        }
        totalBytesReceived += bytesReceived;
        //if (totalBytesReceived > 0)
        //{
        //    break;
        //}
    }
    return totalBytesReceived;
}

main.cpp

#include "TcpClient.h"
#include <string>



int main() {
    TcpClient client;
    if (client.connectToServer("127.0.0.1", 6001))
    {
       client.startHeartbeat(1);  // 启动心跳包机制,间隔时间为5秒
        while (1)
        {
         /*   std::string message = "Hello, server!";
            int sentBytes = client.sendData(message.c_str(), message.length());
            if (sentBytes > 0)
            {
                char buffer[1024] = {0};
                int receivedBytes = client.receiveData(buffer, sizeof(buffer));
                if (receivedBytes > 0)
                {
                    buffer[receivedBytes] = '\0';
                    std::cout << "Received from server: " << buffer << std::endl;
                }
                else
                {
                    std::cout << "Received from server: " << buffer << std::endl;
                }
            }*/
        }
      

        client.stopHeartbeat();  // 停止心跳包机制
    }

    return 0;
}
Windows下C语言的Socket编程例子(TCP和UDP) 1 TCP      Server端 #include "stdafx.h" #include #include #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { //初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADATA wsa 阅读详情

相关推荐

TwinCAT3 TCP Client稳定连接实战指南

TCP Client是工业自动化中实现PLC与上位机、视觉相机、传感器等设备可靠通讯的基础协议;其核心原理涉及三次握手、连接状态机、缓冲区管理与超时重试机制;技术价值在于保障实时性、确定性与容错能力,支撑产线连续运行;典型应用场景包括视觉引导定位、多设备并发接入、长连接心跳保活及断网自恢复;而TwinCAT3的TCPIP库并非标准Winsock封装,其ADS层抽象、SO_LINGER行为、错误码映射与原生socket存在关键差异,导致握手失败、粘包、重连失控等高频问题——本实践方案正基于此内核展开。

weixin_34101229的博客 423

Windows TCP Client

#include "stdafx.h" #include  #include  #include  #pragma comment( lib, "WS2_32.lib" ) const static int _MAX_BUF_SIZE = 256; using namespace std; int _tmain( int argc , _TCHAR

小飞侠 1194

clientDEMO clientdemo调试软件

clientDEMO,监控必备软件,监控调试助手,网络必备 clientDEMO,监控必备软件,监控调试助手,网络必备

windows下实现tcp/ip通信

此时会生成两个项目,右键重命名,一个改为ClientSocket,一个改为ServerSocket。找到Debug文件夹,有的会发现只生成了客户端或者服务器的一个.exe文件。f5再编译一次,打开上面的Debug文件夹,就会发现都有了。C/C++->常规->SDL检查->点击下拉列表->选否。cd Debug的路径(粘贴刚才复制的路径)cd Debug的路径(粘贴刚才复制的路径)链接器->输入->点下拉列表->点编辑。右键解决方案->选择添加->新建项目。点击源文件->添加->新建项。

empwzj的博客 1790

Windows下基于modbusTcp的Client端开发

亲测在windows7下可用

tcpclient测试工具

可以进行windows客户端tcp测试,设置本机端口,便于学生进行网络tcp学习时使用

Windows上实现基于c++的TCP服务器和客户端

运行之后客户端向服务器发送“你好服务器”,服务器收到之后,给客户端发送同样的内容。之后可以通过客户端向服务器发送内容,服务器向客户端发送相同的内容。先运行服务器程序,再运行客户端程序。

endeavor 995

UDS服务应该支持哪些否定响应码

UDS服务应该支持哪些否定响应码所有服务都需支持的否定响应码具体的服务需要支持的否定响应码否定响应码定义及其取值 USD诊断服务的否定响应中包含有导致否定响应原因的编码,称为否定响应码(NRC, Negative Response Code)。否定响应码的取值范围为0x00 - 0xFF,被分为三组: 0x00:服务器内部实现否定响应码判断逻辑时使用,表示要给出肯定响应。 0x01 – 0x7F:诊断通信相关的否定响应码。 0x80 – 0xFF:服务器收到诊断服务请求时,由于某些条件不满足要求而给出的否定

闲聊汽车软件开发 4万+

客户端(TcpClient)与服务器端(TcpListener)

【代码】客户端(TcpClient)与服务器端(TcpListener)

weixin_45371961的博客 584

使用mixamo导入人物动作到unity

导入的材质是withoutSkin时选择Create From Other Model + 选择带withSkin里的。方案二:Textures选择Extract Textures,将文件存放到喜欢的位置(不行继续方案三)2.动画没有动:开个Animation窗口,选择人物的Prefab(Hierachy),查看窗口左侧。方案三:选中素材自带或者导出的Material,接着方案一选择 选中的materials进行转化。选 withSkin,剩下的动作选without Skin)(角色发生位移时出现选项)

big_good_boy的博客 1635

Win10系统安装Ubuntu虚拟机,这回真的是零基础!(结尾附NS3的配置)

Win10系统安装Ubuntu虚拟机(结尾附NS3的配置) 序幕 本人现在还在念大二,有一门很有趣而且老师讲得也不错的课程《计算机网络原理》。这周老师布置了一个实验《NS3网络模拟》,为了详细记录本次实验过程,顺便也便于自己复习,就写了这篇博客,希望能够对你有帮助! NS3是什么呢?实际上就是一门算法,和计算机网络有关的。不过在我们日常使用的Windows系统上去做这个实验是行不通的,这个实验一定要在Linux系统上进行模拟才能玩的下去,作为一名 Windows选手对此表示不爽但是没办法,为了实验也只

灼热之翼的博客 7382

【网络编程】windows下的TCP通信(server/client)

server.cpp #include <iostream> //#include "stdafx.h" #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") using namespace std; int main(){ WSADATA wsaData; if(WSAStartup(MAKEWORD(2,2),&wsaData)){ cout<<"WinSock不能被初始化"; WSACle

VICI的博客 2828

用V E S C 6-M K V I 第六代调速控制器给VESC电调刷固件

文章摘要:本文介绍了一款先进的电机控制器,具备多项创新技术。核心亮点包括三相电流/电压检测、四象限无缝运行、多模式兼容等先进电机控制技术,以及智能感知与安全保护、高效能电源管理、多样化连接与扩展功能。此外,该控制器支持实时数据监测与用户交互,具备开源生态和工业级可靠性,适用于电动载具、机器人及工业领域。用户需注意散热要求和兼容性提示,可通过VESC-Tool软件进行灵活配置。产品可在常竹科技淘宝店购买,并加入技术交流群获取支持。

2403_89422757的博客 1364

windows下编译WebRTC源码并运行官方demo

一、环境 win10操作系统,并装有vs2019、windows sdk、git等常规开发软件。最好装上python,我用的版本是2.7 二、下载源码并编译 打开windows cmd命令行。 //切换到webrtc的下载目录,自己新建的文件夹 cd C:\webrtc set WINDOWSSDKDIR=C:\Program Files (x86)\Windows Kits\10 set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Vis

weixin_43327696的博客 1609

PHY6252开发实战:从零构建BLE串口透传应用

本文详细介绍了PHY6252开发板在BLE串口透传应用中的实战经验,包括开发环境搭建、BLE串口透传例程解析、AT指令集实现与扩展、数据透传机制优化以及常见问题排查指南。通过智能家居遥控器项目案例,展示了PHY6252在低功耗物联网设备开发中的实际应用。

weixin_29183637的博客 312

2025.06.16【转录组】|Ribo-seq数据流程详解(二 基因组比对)

本文详细介绍了Ribo-seq数据分析中的比对流程,包括环境准备、STAR索引构建、比对参数设置及结果统计可视化。通过samtools和R脚本实现比对质量评估,提供常见问题解决方案和关键指标解读。该流程强调比对参数优化和质量控制,为后续翻译组学分析奠定基础。

1977

java socket框架_优秀的国产高性能TCP/UDP/HTTP开源网络通信框架——HP-Socket

介绍HP-Socket是国人开发的一套高性能的TCP/UDP/HTTP网络通信框架,包含了服务端、客户端以及Agent组件,可用于各种不同应用场景的通信系统,并且提供了C/C++、C#、Delphi、E、Java、Python等编程语言接口。 HP-Socket 对通信层完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧...

weixin_39665762的博客 1489

Windows原生与WSL2环境下OpenClaw性能与兼容性的对比分析研究

本文对比分析了Windows原生环境与WSL2环境下运行OpenClaw的性能与兼容性。Windows原生环境提供深度系统集成、图形界面支持和硬件加速优势,适合需要Windows生态集成的用户;WSL2则提供接近原生Linux的性能体验,兼容Linux工具链,适合开发者和跨平台需求。文章详细介绍了两种环境下的推荐硬件配置、系统版本选择及必备工具,并提供了具体的部署步骤指南。研究表明,两种环境各有适用场景,用户可根据需求选择最适合的部署方式。

一键难忘的博客 1218

socket 编程(五) windows tcp

socket

wjmasd的博客 836

基于电能质量治理的场景实例:统一电能质量调节器(UPQC)与并网逆变器集成

本文通过Simulink平台,详细演示了统一电能质量调节器(UPQC)与并网逆变器的集成系统建模与仿真过程。主要内容包括:1)系统架构设计,包含光伏并网系统、非线性负载和电压扰动源;2)UPQC主电路设计,包括串联/并联单元拓扑和控制策略实现;3)与并网逆变器的能量交互与协同控制逻辑;4)典型电能质量问题的仿真测试场景。结果表明,该集成系统能有效治理电压暂降(维持负载电压380V±2%)和电流谐波(电网THD<3%),直流母线电压稳定在800V±5V。该系统为应对复杂电能质量问题提供了"电压

xiaoheshang_123的博客 310

VC++运行库集合 6.0-2017

VC++运行库集合 6.0-2017,包含了所有VC++运行库的所有集合,非常棒

VC++实现++tcp网络通讯服务器+客户端(附带源码)

本文将展示如何使用 VC++ 实现一个简单的 TCP 网络通信应用,包括服务器端和客户端。服务器端负责监听客户端请求并返回数据,而客户端向服务器发送请求并接收响应。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1320

基于jsp+servlet的家用电器购物商城管理系统(源码+数据库)87

基于jsp+servlet的家用电器购物商城管理系统:前端 jsp、jquery、layui,后端 servlet、jdbc,角色分为管理员、用户;集成商品管理、销售管理、商品购买、购物车,在线付款等功能于一体的系统。## 功能介绍### 管理员- 商品管理:商品信息的增删改查,图片上传- 销售管理:订单列表查询,销售统计,包含库存、销售数量、金额数据等### 用户- 基本功能:登录,注册、退出- 网站首页:导航栏,轮播图,商城精选,昨日商品- 商品购买:详情详情浏览,加入购物车,购物车提交购买,收货地址新增和选择,付款,提交订单- 我的订单:订单列表查询## 环境- <b>IntelliJ IDEA 2021.3</b>- <b>Mysql 5.7.26</b>- <b>Maven</b>- <b>JDK 1.8</b>

peerconnection_client分析笔记

Windows版本的peerconnection_client demo是一个win32程序,入口函数为main.cc里面的wWinMain,程序整体流程就从这个入口函数下手开始分析。 1.peerconnection_client demo中主要的类的关系 整个demo中有3个主要的类分别是窗口类MainWnd,它的主要功能是实现了一个窗体程序,然后是PeerConnectionClient...

风平浪静的专栏 3858

电影院售票管理系统(Java+Servlet+JSP+JDBC+Mysql)

Java项目_电影院售票管理系统(java+Servlet+JSP+JDBC+Mysql)含有代码注释,新手也可看懂,个人手打98分项目,功能完善、界面美观、操作简单、功能齐全、管理便捷,可作为毕设、期末大作业使用。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

健身锻炼计划数据集(26列,600K+ 记录)CSV

这个全面的健身数据集包含超过 600,000 个结构化锻炼程序和从健身计划平台数据中抓取的锻炼条目。该数据集包括详细的锻炼级数据和计划级摘要,非常适合构建推荐系统、分析锻炼模式和理解健身计划结构。主要数据集(fitness_exercises.csv):605,033 个个人运动条目,包含详细的锻炼信息计划摘要 (program_summary.csv):2,598 个独特的健身计划,包含汇总元数据主数据集(605K+ 行):练习详情:名称、组数、次数、强度计划结构:周、日、每次锻炼的时间用户定位:健身水平、目标、设备需求时态数据:创建和编辑时间戳程序元数据:长度、每次锻炼的练习次数课程摘要(2.6K+ 课程):计划概述:标题、描述、健身水平目标和设备要求计划持续时间和锻炼时间每个程序的总锻炼次数创建和修改时间戳

Windows平台C++实现最简单TCP通信教程

极简单版本,无难点

Blue噜噜噜的博客 226

Windows TCP 通信测试_1

手动输入的client会把服务端的进程阻塞住,导致另一个client的消息也进不来,手动输入消息后,会暂时解除当前阻塞,问题不小,小白太难了,后面再搞。应用函数 socket、bind、connect、listen、accept、recv、send(win下的函数)等。(bug:目前手动输入过长字符会有发送异常的情况出现)1、为了一次打印client发送的消息,做了一点愚蠢的特殊处理。目前也没超时,不能很好的处理多个客户端的互相影响。2、没有做超时,socket没有消息会一直阻塞;

weixin_41885845的博客 718

castv2-client 安装与环境搭建避坑教程:Windows 与 Linux 完整指南

如果你正在寻找一个基于全新 CASTV2 协议的 **castv2-client 安装** 方案,那么这篇文章正是为你准备的。castv2-client 是一个用 Node.js 编写的 Chromecast 客户端库,可以让你用几行代码就能发现设备、启动媒体应用、推流视频音频,堪称智能家居与影音折腾爱好者的"投屏神器"。不过,很多新手在 **环境搭建** 的第一步——安装环节就频频踩坑,尤其是

gitblog_00465的博客 411

Windows网络编程~TCP/IP~c/s简单demo (三)

TCP客户端服务器: UDP客户端服务器: server端代码 #include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib,"Ws2_32.lib") //标记 BOOL g_nFlag = TRUE; int main(void) { //打开网络库 WORD wdVersion = MAKEWORD(1, 1); WSADATA wsaData;

yazjy1的博客 527
上一篇: windows TCP Server demo
下一篇: pythonGPIB读写稳压源程控电源
越甲八千
博客等级 码龄11年 2956粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值