当前位置: 首页 > news >正文

基于Linux的TCP服务端客户端通信(一)

这个只是拿来练手的,来简单实现一下,后续再考虑要不要在这个基础上进行更新迭代。

运用技术:

目前只是用到socket编程socket()、bind()、listen()、accept()、send()、recv()等系统调用。

多线程的话考虑使用pthread库来进行处理多个客户端的连接。

下面将进行一步一步的实现,也作为我的一个记录。

首先要知道TCP的话是个面向连接的,所以需要connect这种来创建连接后再进行通信。

// 进入项目,初始化git
$ git init
// 查看本地文件有没有添加到git管理的
$ git status
// 本地仓库与远程仓库关联
$ git remote add origin ssh@
// 更新本地项目
$ git pull origin master
// 把内容先暂存到那个本地电脑暂存区
$ git add .
// 提交到本地仓库
$ git commit -m '注释信息'
// 强制覆盖前远程代码库为空,覆盖不会丢失代码
$ git push -u origin master -f// 克隆仓库
$ git clone ssh@

首先是server.cpp文件代码内容:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>int main() {// 创建 socketint server_sock = socket(AF_INET, SOCK_STREAM, 0);if (server_sock < 0) {std::cerr << "Socket creation failed" << std::endl;return 1;}// 服务器地址struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);  // 端口号server_addr.sin_addr.s_addr = INADDR_ANY;  // 任意IP// 绑定 socketif (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Bind failed" << std::endl;return 1;}// 开始监听连接if (listen(server_sock, 5) < 0) {std::cerr << "Listen failed" << std::endl;return 1;}std::cout << "Server is listening on port 8080..." << std::endl;// 接受客户端连接int client_sock;struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr);client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_len);if (client_sock < 0) {std::cerr << "Accept failed" << std::endl;return 1;}// 接收客户端消息char buffer[1024];int bytes_received = recv(client_sock, buffer, sizeof(buffer), 0);if (bytes_received < 0) {std::cerr << "Receive failed" << std::endl;return 1;}buffer[bytes_received] = '\0';  // Null 终止字符串std::cout << "Message from client: " << buffer << std::endl;// 回复客户端const char* message = "Hello from server!";send(client_sock, message, strlen(message), 0);// 关闭连接close(client_sock);close(server_sock);return 0;
}

下面是client.cpp代码内容

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>int main() {// 创建socketint sock = socket(AF_INET, SOCK_STREAM, 0);if(sock < 0) {std::cout << "Socket create failed" << std::endl;return 1;}// 服务器地址struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);  // 端口号server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  // 服务器IP// 连接到服务器if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Connection failed" << std::endl;return 1;}// 发送消息const char* message = "Hello Server!";send(sock, message, strlen(message), 0);std::cout << "Message sent to server: " << message << std::endl;// 接收服务器响应char buffer[1024];int bytes_received = recv(sock, buffer, sizeof(buffer), 0);if (bytes_received < 0) {std::cerr << "Receive failed" << std::endl;return 1;}buffer[bytes_received] = '\0';  // Null 终止字符串std::cout << "Message from server: " << buffer << std::endl;// 关闭连接close(sock);return 0;
}

需要写一个CMakeLists.txt来帮助编译

cmake_minimum_required(VERSION 3.10)project(TcpComm)set(CMAKE_CXX_STANDARD 11)include_directories(${PROJECT_SOURCE_DIR}/src)add_executable(client src/client.cpp)
add_executable(server src/server.cpp)

接下来步骤我直接写一起了

// 在项目根目录下面创建并进去build文件夹
mkdir build
cd build// 使用cmake和make编译项目
cmake ..
make

这个时候build里会出现两个编译好的server和build,然后两个终端分别运行即可。

下次优化,自行进行输入输出。

http://www.dtcms.com/a/576888.html

相关文章:

  • 在 VSCode 中:引入开源cJSon解析库+示例demo
  • SwiftUI 组件开发: 自定义下拉刷新和加载更多(iOS 15 兼容)
  • 【面试】分布式事务与分布式锁:核心原理与工程实践
  • 大连制作网站企业优化网站性能
  • 搜索引擎索引权威指南:抓取、收录与排名的基础
  • 电脑关机重启时显示rundll32 内存不能为read解决方法
  • 【P7】docker镜像发布和部署
  • 电脑启动时报 0xc000000e —— 原因解析与多种修复策略
  • 网站建设需求范文包装回收网站建设
  • 使用 Apache Jena 构建 Java 知识图谱
  • ICLR 2025 | 告别“非黑即白”!X-CLR引入“相似度图谱”,让模型读懂万物关联!
  • 【图像处理基石】什么是alpha matting?
  • 面试后查缺补漏--cmake,makefiles,g++,gcc(自写精华版)
  • 使用房屋价格预测的场景,展示如何从多个影响因素计算权重和偏置的梯度
  • 企业网站的首页设计模板天津seo方案
  • 微服务之OpenFeign、hystrix熔断降级、loadbalancer负载均衡
  • 【微服务】(4) 负载均衡
  • 【Qt】Qt实践记录3——UDP通信
  • 考研408--计算机网络--day3--
  • 从云原生部署到智能时序分析:基于 Kubernetes 的 Apache IoTDB 集群实战与 TimechoDB 国产化增强特性深度解析
  • LLaVA-NeXT 学习笔记
  • 投资融资理财网站模板网站搭建福州公司
  • OpenStack创建实例一直处于创建且未分配IP问题解决
  • C++的诗行:一文掌握内存管理中 new/delete 接口正确调用与常见场景适配
  • 谷歌网站 百度做网站对服务器什么要求高
  • Smartproxy 企业级解决方案
  • 图像分类深度学习
  • 自监督骨干(DINOv2)用于内镜分割与跟踪的全面实现分析
  • 6.基础--SQL--DDL表操作-创建查询
  • 《算法闯关指南:优选算法--位运算》--34.判断字符是否唯一,35.丢失的数字