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…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
