多机TCP通讯之hello world(C++)

这篇具有很好参考价值的文章主要介绍了多机TCP通讯之hello world(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TCP是什么

TCP(传输控制协议)是一种在计算机网络中广泛使用的协议,它提供了可靠的、面向连接的数据传输服务。TCP 是 OSI 模型中的传输层协议,它确保了数据的可靠性、顺序性和流控制。

以下是 TCP 通讯的一些关键特点和概念:

  • 可靠性: TCP 提供可靠的数据传输。它使用确认机制,确保数据的每个部分都已被成功接收,如果数据在传输中出现错误或丢失,TCP 将负责重新传输。

  • 面向连接: TCP 是一种面向连接的协议。在进行数据传输之前,必须先建立连接。连接的建立和终止都需要一些握手和挥手的过程,以确保双方都已准备好进行通信。

  • 全双工通信: TCP 支持全双工通信,即双方可以同时发送和接收数据。这使得双方能够在同一时间内进行双向的通信。

  • 流控制: TCP 使用窗口控制机制来进行流量控制。这确保了在通信双方之间合适的速率上进行数据传输,防止发送方发送过多数据导致接收方无法处理。

  • 顺序性: TCP 保证传输的数据按照发送的顺序到达接收端。即使在网络中出现乱序的情况,TCP 会重新排序数据,以确保按照正确的顺序进行处理。

  • 连接管理: TCP 提供连接的建立、维护和释放。连接的建立和释放过程中包含握手和挥手的步骤,以确保通信的可靠性和一致性。

  • 端口和套接字: 在 TCP 通信中,通信的双方通过端口和套接字进行标识。端口用于标识特定的应用程序,而套接字则表示在网络中的通信端点。

  • 可靠的错误检测和重传机制: TCP 使用序号和确认号来确保数据的可靠传输。如果发送方没有收到确认,它将会重新发送数据。

总体而言,TCP 是一种适用于可靠、有序、面向连接的数据传输的协议。它适用于需要确保数据完整性的应用场景,如文件传输、网页浏览、电子邮件等。然而,由于其一些额外的开销和复杂性,对于一些实时性要求较高的应用,可能会选择使用UDP等协议。

准备工作

  • 打开防火墙: sudo ufw enable
  • 打开目标端口:例如打开22端口sudo ufw allow 22
  • 测试前,ping一下,看连接是或否成功。

两端的通讯流程
多机TCP通讯之hello world(C++),多机通讯,tcp/ip,c++,网络

CMakeLists.txt

cmake_minimum_required(VERSION 3.18)
project(ExampleProgram)

set(CMAKE_CXX_STANDARD 11)


add_executable(tcp-client tcp-client.cpp)
add_executable(tcp-server tcp-server.cpp)


# Add -lpthread
target_link_libraries(tcp-client pthread)
target_link_libraries(tcp-server pthread)

服务端代码

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main() {
    // 创建服务器套接字
    int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == -1) {
        std::cerr << "Failed to create server socket." << std::endl;
        return 1;
    }

    // 设置服务器地址结构
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(8080); // 服务器监听的端口号

    // 绑定套接字
    if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
        std::cerr << "Bind failed." << std::endl;
        close(serverSocket);
        return 1;
    }

    // 监听连接
    if (listen(serverSocket, SOMAXCONN) == -1) {
        std::cerr << "Listen failed." << std::endl;
        close(serverSocket);
        return 1;
    }

    std::cout << "Server is listening for incoming connections..." << std::endl;

    while (true) {
        // 接受连接
        int clientSocket = accept(serverSocket, NULL, NULL);
        if (clientSocket == -1) {
            std::cerr << "Accept failed." << std::endl;
            close(serverSocket);
            return 1;
        }

        std::cout << "Connection established with a client." << std::endl;

        // 发送消息给客户端
        const char* message = "Hello from server!";
        if (send(clientSocket, message, strlen(message), 0) == -1) {
            std::cerr << "Error sending message." << std::endl;
        }

        // 关闭客户端套接字
        close(clientSocket);
    }

    // 服务器永远不会执行到这里,但可以加上关闭服务器套接字的代码
    close(serverSocket);

    return 0;
}

客户端代码

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main() {
    while (true) {
        // 创建客户端套接字
        int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
        if (clientSocket == -1) {
            std::cerr << "Failed to create client socket." << std::endl;
            return 1;
        }

        // 设置服务器地址结构
        sockaddr_in serverAddr;
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_addr.s_addr = inet_addr("192.168.110.83"); // 服务器的 IP 地址
        serverAddr.sin_port = htons(8080); // 服务器监听的端口号

        // 连接到服务器
        if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
            std::cerr << "Connection failed." << std::endl;
            close(clientSocket);
            return 1;
        }

        std::cout << "Connected to the server." << std::endl;

        // 接收消息
        char buffer[256];
        memset(buffer, 0, sizeof(buffer));
        if (recv(clientSocket, buffer, sizeof(buffer), 0) == -1) {
            std::cerr << "Error receiving message." << std::endl;
        } else {
            std::cout << "Received message from server: " << buffer << std::endl;
        }

        // 关闭客户端套接字
        close(clientSocket);

        // 在这里可以添加一些延时,以避免过于频繁地连接服务器
        sleep(1);
    }

    return 0;
}

参考

https://blog.csdn.net/cyj_001/article/details/131782022
https://www.bilibili.com/video/BV1ne411A7hP/?spm_id_from=333.337.search-card.all.click&vd_source=667c3d14dbb51ec849c0bc7c38329d10文章来源地址https://www.toymoban.com/news/detail-781235.html

到了这里,关于多机TCP通讯之hello world(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • S7-1200PLC的TCP/IP通讯

    图1 TSEND_C指令 如图是TSEND_C指令,它的作用是建立连接并发送数据。对于其中各个参数的作用如下表: 参数 说明 REQ 在上升沿启动发送作业 CONT 控制通信连接 CONNECT 指向连接描述结构的指针 DATA 指向发送区的指针,该发送区包含要发送数据的地址和长度 DONE 状态参数,可表示发

    2024年04月10日
    浏览(47)
  • EtherCAT转TCP/IP网关ethercat最大通讯距离

    天啊!你们听说了吗?数据互联互通问题终于迎来了突破性进展!作为生产管理系统的关键部分,数据互联互通一直是个大问题。然而,ETHERCAT和TCP/IP是两个不同的协议,它们之间的通讯一直是个大 问题。但是,现在有一款神奇的产品出现了,它叫做远创智控YC-ECT-TCPIP,它可

    2024年02月13日
    浏览(42)
  • TwinCAT3以太网TCP/IP自由协议通讯

    目录 一、TwinCAT3以太网TCP/IP客户端创建 1、系统连接示意图 1、程序创建 (1)工程创建和授权添加  (2)库文件添加  (3)变量创建 (4)程序 2、测试 (1)网络调试助手创建服务端监听 (2)PLC端的Client连接服务端  (3)PLC端给服务端发送数据  (4)服务端给PLC发送数据 二、

    2024年02月15日
    浏览(50)
  • 东方鼎晨:KEPServerEX与西门子1200通讯 TCP/IP

    KEPServerEX 与西门子1200通讯 TCP/IP 北京东方鼎晨科技有限公司 目 录 1. 前言 2. S7-1200 PLC端相关设置 3. Kepware端相关设置 4. 附Siemens S7 Plus Ethernet通讯 KEPServerEX是美国PTC Kepware公司生产的具有行业普遍性的连接平台,KEPServerEX支持150多种通讯协议,用于向您的所有应用程序提供单一来

    2024年02月03日
    浏览(64)
  • Qt6教程之三(13) TCP/IP通讯与socket编程

    目录 一 前言 二 TCP/IP协议架构和通信原理 三 TCP/IP的连接与断开过程 四 Qt中开发TCP/IP原理概述 五 完整实例代码示范 在软件开发中,常用的技术体系里面网络通信属于最重要的 “联通” 技术,是必须要掌握的技术。 那为什么网络通信如此重要呢,我想大概有以下几点: 不

    2024年02月12日
    浏览(44)
  • 实现S7-200smart通过MODBUS TCP/IP与matlab通讯

    目录 S7-200smart通过MODBUS TCP/IP与matlab通讯 两台PLC之间建立Modbus TPC/IP通讯 MODBUS TCP Client梯形图各个参数的功能: MODBUS TCP Server梯形图各个参数的功能: 两台S7-200smart之间通过Modbus TCP连接: MATLAB端建立Modbus TCP客户端: 通过函数建立Modbus TCP客户端 通过Matlab-Industment Control工具箱进

    2024年02月03日
    浏览(94)
  • 【网络】TCP通讯(三次握手、四次挥手;滑动窗口;TCP状态转换;端口复用;TCP心跳检测机制)

     前言:建议看着图片,根据文字描述走一遍TCP通讯过程,加深理解。 目录 TCP通信时序: 1)建立连接(三次握手)的过程: 2)数据传输的过程: 3)关闭连接(四次挥手)的过程: 滑动窗口 (TCP流量控制): TCP状态转换: 半关闭: 2MSL: 程序设计中的问题: 端口复用:

    2024年02月07日
    浏览(61)
  • 【Linux Day15 TCP网络通讯】

    接口介绍 socket()方法是用来创建一个套接字 ,有了套接字就可以通过网络进行数据的收发。创建套接字时要指定使用的服务类型,使用 TCP 协议选择流式服务(SOCK_STREAM)。 **bind()方法是用来指定套接字使用的 IP 地址和端口。**IP 地址就是自己主机的地址,测试程序时可以使

    2024年02月19日
    浏览(42)
  • 韦根、RS485、TCP/IP三种门禁通讯方式的优缺点对比

    韦根通讯 韦根通讯协议是由摩托罗拉公司制定的一种通讯协议,具有国际统一标准。它适用于涉及门禁控制系统的读卡器和卡片的许多特性,是智能门禁最早使用的门禁通讯方式,但现在基本已经看不到它的身影了。 优点: 实现简单,基本上任意单片机都可以实现,成本低

    2024年02月13日
    浏览(60)
  • FANUC机器人嵌入式TCP/IP以太网通讯的具体方法

    在工业自动化领域中,FANUC机器人是广泛应用的一种先进设备。为了实现机器人与其他设备之间的通信,TCP/IP以太网是一种常用的通信协议。本文将介绍如何在FANUC机器人中实现嵌入式TCP/IP以太网通讯,并提供相应的源代码。 配置网络参数 首先,我们需要在FANUC机器人上配置

    2024年02月04日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包