Socket实现服务器和客户端
Socket 编程是一种用于在网络上进行通信的编程方法,以下代码可以实现在不同主机之间传输数据。
Socket 编程中服务器端和客户端的基本步骤:
服务器端步骤:
1.创建 Socket:
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
- 使用 socket 函数创建一个套接字。
- AF_INET 表示使用 IPv4 地址族。
- SOCK_STREAM 表示使用 TCP 协议,如果使用 UDP,则为 SOCK_DGRAM。
2.绑定地址和端口:
struct sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_addr.s_addr = INADDR_ANY;serverAddress.sin_port = htons(PORT);bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
- 初始化服务器地址结构体 sockaddr_in,设置 IP 地址和端口。
- 使用 bind 函数将套接字绑定到指定的地址和端口。
3.监听连接请求:
listen(serverSocket, BACKLOG);
- 使用 listen 函数开始监听连接请求。
- BACKLOG 参数指定连接请求队列的最大长度。
4.接受客户端连接:
int clientSocket = accept(serverSocket, NULL, NULL);
- 使用 accept 函数接受客户端的连接请求。
- 返回一个新的套接字 clientSocket,用于与客户端通信。
5.接收和发送数据:
使用 recv 函数从客户端接收数据,使用 send 函数向客户端发送数据。
关闭连接:
close(clientSocket);close(serverSocket);
使用 close 函数关闭连接的套接字。
客户端步骤:
1. 创建 Socket:
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
- 使用 socket 函数创建一个套接字。
- 设置服务器地址和端口:
struct sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_addr.s_addr = inet_addr(SERVER_IP);serverAddress.sin_port = htons(PORT);
- 初始化服务器地址结构体 sockaddr_in,设置服务器的 IP 地址和端口。
- 连接到服务器:
connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
- 使用 connect 函数连接到服务器。
- 发送和接收数据:
- 使用 send 函数向服务器发送数据,使用 recv 函数从服务器接收数据。
- 关闭连接:
close(clientSocket);
使用 close 函数关闭连接的套接字。
解决分包、粘包问题
Socket实现模拟TCP通信粘包问题-CSDN博客
Client:
#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>int main(){//1.创建socketint client_sock=socket(AF_INET,SOCK_STREAM,0);if (client_sock==-1){std::cerr<<"Faild to create socket"<<std::endl;return -1;}//2.连接服务器struct sockaddr_in server_addr;server_addr.sin_family=AF_INET;//server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");inet_pton(AF_INET,"127.0.0.1",&server_addr.sin_addr.s_addr);server_addr.sin_port=htons(9999);if(connect(client_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1){std::cerr<<"Faild to connect socket"<<std::endl;return -1;}std::cout<<"Connected to server"<<std::endl;//3.数据交互//发送消息std::string msg="Hello server!\n";if(write(client_sock,msg.c_str(),msg.length())==-1){std::cerr<<"Faild to write "<<std::endl;return -1;}//接受消息char buffer[1024];if(read(client_sock,buffer,sizeof(buffer))==-1){std::cerr<<"Faild to read"<<std::endl;return -1;}printf("Receive to server :%s",buffer);close(client_sock);}
Server:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>int main(int, char**){//1.创建套接字int listen_sock=socket(AF_INET,SOCK_STREAM,0);if (listen_sock==-1){std::cerr<<"Fiald to create socket"<<std::endl;return 1;}//2.绑定IP地址struct sockaddr_in server_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_addr.s_addr=INADDR_ANY;server_addr.sin_family=AF_INET;server_addr.sin_port=htons(9999);if(bind(listen_sock,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1){std::cerr<<"Fiald to bind socket"<<std::endl;return 1;}//3.监听套接字if (listen(listen_sock,5)==-1){std::cerr<<"Fiald to listen socket"<<std::endl;return 1;}std::cout<<"server is listening"<<std::endl;//4.接受客户端的连接struct sockaddr_in client_addr;socklen_t client_addr_len=sizeof(client_addr);int client_sock=accept(listen_sock,(struct sockaddr*)&client_addr,&client_addr_len);if (client_sock==-1){std::cerr<<"Fiald to accept socket"<<std::endl;return 1;}std::cout<<"a client connected"<<std::endl;//5.数据交互//接受消息char buffer[1024];int read_size=read(client_sock,buffer,sizeof(buffer));if (read_size==-1) {std::cerr<<"Fiald to read"<<std::endl;return 1;}std::cout<<"Received to client :"<<buffer<<std::endl;std::string res_msg="Hello Client!";int wr=write(client_sock,res_msg.c_str(),res_msg.length());if (wr==-1){std::cerr<<"Fiald to write"<<std::endl;return 1;}close(client_sock);close(listen_sock);}
相关文章:

Socket实现服务器和客户端
Socket 编程是一种用于在网络上进行通信的编程方法,以下代码可以实现在不同主机之间传输数据。 Socket 编程中服务器端和客户端的基本步骤:服务器端步骤: 1.创建 Socket: int serverSocket socket(AF_INET, SOCK_STREAM, 0);…...

智能GPT图书管理系统(SpringBoot2+Vue2)、接入GPT接口,支持AI智能图书馆
☀️技术栈介绍 ☃️前端主要技术栈 技术作用版本Vue提供前端交互2.6.14Vue-Router路由式编程导航3.5.1Element-UI模块组件库,绘制界面2.4.5Axios发送ajax请求给后端请求数据1.2.1core-js兼容性更强,浏览器适配3.8.3swiper轮播图插件(快速实…...
面试经典 150 题 ---- 合并两个有序数组
面试经典 150 题 ---- 合并两个有序数组 合并两个有序数组方法一:直接合并后排序方法二:双指针方法三:逆向双指针 合并两个有序数组 方法一:直接合并后排序 这种方法最简单,直接将 nums2 的数组放到 nums1 数组的尾部…...

防火墙在企业园区出口安全方案中的应用(ENSP实现)
拓扑图 需求: 1、企业出口网关设备必须具备较高的可靠性,为了避免单点故障,要求两台设备形成双机热备状态。当一台设备发生故障时,另一台设备会接替其工作,不会影响业务正常运行。 2、企业从两个ISP租用了两条链路&…...

单片机学习笔记---矩阵键盘密码锁
目录 一,设置密码按键 1.设置密码区域 2.设置输入的数字左移 3.设置记录按键的次数 二,设置确认键 1.密码正确时显示OK 2.密码错误时显示ERR 3.密码错误恢复初始状态重输 三,设置取消键 学了这么久,迫不及待想要做一个密…...

8-小程序数据promise化、共享、分包
小程序API Promise化 wx.requet 官网入口 默认情况下,小程序官方异步API都是基于回调函数实现的 wx.request({method: , url: , data: {},header: {content-type: application/json // 默认值},success (res) {console.log(res.data)},fail () {},complete () { }…...

[HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页
希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…...

Threejs 展示——obj 格式模型导入
文章目录 需求分析1. HTML版本2. Vue 版本 需求 导入obj 格式的模型数据 分析 .obj:Wavefront OBJ 格式,是一种广泛使用的三维模型文件格式。预览 .obj格式文件的软件可点此下载需要准备两种格式的数据,如下所示 1. HTML版本 html <!…...

深入浅出 diffusion(3):pytorch 实现 diffusion 中的 U-Net
导入python包 import mathimport torch import torch.nn as nn import torch.nn.functional as F silu激活函数 class SiLU(nn.Module): # SiLU激活函数staticmethoddef forward(x):return x * torch.sigmoid(x) 归一化设置 def get_norm(norm, num_channels, num_groups)…...

C#使用RabbitMQ-2_详解工作队列模式
简介 🍀RabbitMQ中的工作队列模式是指将任务分配给多个消费者并行处理。在工作队列模式中,生产者将任务发送到RabbitMQ交换器,然后交换器将任务路由到一个或多个队列。消费者从队列中获取任务并进行处理。处理完成后,消费者可以向…...

Day37 56合并区间 738单调递增的数字 968监控二叉树
56 合并区间 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. class Solution { public:vector<vector<int>>…...

【Android】在WSA安卓子系统中进行新实验性功能试用与抓包(2311.4.5.0)
前言 在根据几篇22和23的WSA抓包文章进行尝试时遇到了问题,同时发现新版Wsa的一些实验性功能能优化抓包配置时的一些步骤,因而写下此篇以作记录。 Wsa版本:2311.40000.5.0 本文出现的项目: MagiskOnWSALocal MagiskTrustUserCer…...
【服务器】服务器的管理口和网口
服务器通常会有两种不同类型的网络接口,即管理口(Management Port)和网口(Ethernet Port),它们的作用和用途不同。 一、管理口 管理口通常是用于服务器管理的网络接口,也被称为外带网卡或带外接…...
一个小例子,演示函数指针
结构体里经常看到函数指针的写法,函数指针其实就是函数的名字。但是结构体里你要是直接把一个函数摆上去,那就变成成员变量,就会发生混乱 1. 函数指针 #include <unistd.h> #include <stdio.h>struct Kiwia{void (*func)(int )…...

python12-Python的字符串之使用input获取用户输入
input()函数用于向用户生成一条提示,然后获取用户输入的内容。由于input0函数总会将用户输入的内容放入字符串中,因此用户可以输入任何内容,input()函数总是返回一个字符串。例如如下程序。 # !/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2024/01# @Author : Lao…...

【代码随想录-数组】移除元素
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…...
springboot事务管理
/*spring事务管理注解:Transactional位置:业务(service)层的方法上、类上、接口上作用:将当前方法交给spring进行事务管理,方法执行前,开启事务:成功执行完毕,提交事务:出现常,回滚事务需要在配置文件是加上开启spring事务yml文件…...

数据结构——链式二叉树(2)
目录 🍁一、二叉树的销毁 🍁二、在二叉树中查找某个数,并返回该结点 🍁三、LeetCode——检查两棵二叉树是否相等 🌕(一)、题目链接:100. 相同的树 - 力扣(LeetCode&a…...

spring-boot-starter-validation常用注解
文章目录 一、使用二、常用注解三、Valid or Validated ?四、分组校验1. 分组校验的基本概念2. 定义验证组3. 应用分组到模型4. 在控制器中使用分组5. 总结 一、使用 要使用这些注解,首先确保在你的 Spring Boot 应用的 pom.xml 文件中添加了 spring-bo…...

AF700 NHS 酯,AF 700 Succinimidyl Ester,一种明亮且具有光稳定性的近红外染料
AF700 NHS 酯,AF 700 Succinimidyl Ester,一种明亮且具有光稳定性的近红外染料,AF700-NHS-酯,具有水溶性和 pH 值不敏感性 您好,欢迎来到新研之家 文章关键词:AF700 NHS 酯,AF 700 Succinimid…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...