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

http客户端简单demo

socket.h头文件

#pragma once
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string>
using std::string;namespace MySocket
{class Socket{public:Socket();Socket(int sockfd);~Socket();bool bind(const string &ip, int port);bool listen(int backlog);bool connet(const string &ip, int port);int accept();int send(const char *buf, int len);int recv(char *buf, int len);void close();bool set_non_blocking();bool set_send_buffer(int size);bool set_recv_buffer(int size);bool set_linger(bool active, int seconds);bool set_keepalive();bool set_reuse_addr();protected:string ip_;int port_;int sockfd_;};
}

socket.cpp

#include "socket.h"
#include <fcntl.h>
//#include <socket/socket.h>
using namespace MySocket;Socket::Socket() : ip_(""), port_(0), sockfd_(0)
{sockfd_ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sockfd_ < 0) {printf("socket bind error: errno=%d, errmsg=%s\n", errno, strerror(errno));}printf("create socket success!\n");
}Socket::Socket(int sockfd) : ip_(""), port_(0), sockfd_(sockfd)
{}Socket::~Socket()
{close();
}bool Socket::bind(const string &ip, int port)
{struct sockaddr_in sockaddr;std::memset(&sockaddr, 0, sizeof(sockaddr));sockaddr.sin_family = AF_INET;sockaddr.sin_addr.s_addr = inet_addr(ip.c_str());sockaddr.sin_port = htons(port);if (::bind(sockfd_, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0){printf("socket bind error: errno=%d, errmsg=%s\n", errno, strerror(errno));return false;}ip_ = ip;port_ = port;printf("socket bind success: ip=%s port=%d\n", ip.c_str(), port);return true;
}bool Socket::listen(int backlog)
{if (::listen(sockfd_, backlog) < 0){printf("socket listen error: errno=%d errmsg=%s\n", errno, strerror(errno));return false;}printf("socket listen ...\n");return true;
}bool Socket::connet(const string &ip, int port)
{struct sockaddr_in sockaddr;std::memset(&sockaddr, 0, sizeof(sockaddr));sockaddr.sin_family = AF_INET;sockaddr.sin_addr.s_addr = inet_addr(ip.c_str());sockaddr.sin_port = htons(port);if (::connect(sockfd_, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0){printf("socket connect error: errno=%d errmsg=%s\n", errno, strerror(errno));return false;}ip_ = ip;port_ = port;printf("socket connet success: ip=%s port = %d\n", ip.c_str(), port);return true;
}int Socket::accept()
{int connfd = ::accept(sockfd_, nullptr, nullptr);if (connfd < 0){printf("socket accept error: errno=%d errmsg=%s\n", errno, strerror(errno));return false;}printf("socket accept success: connfd=%d \n", connfd);return connfd;
}int Socket::send(const char *buf, int len)
{return ::send(sockfd_, buf, len, 0);
}int Socket::recv(char *buf, int len)
{return ::recv(sockfd_, buf, len, 0);
}void Socket::close()
{if (sockfd_ > 0){::close(sockfd_);}
}bool Socket::set_non_blocking()
{int flags = ::fcntl(sockfd_, F_GETFL, 0);if (flags < 0){printf("socket set_non_blocking error:error=%d, errmsg = %s", errno, strerror(errno));return false;}flags |= O_NONBLOCK;if (::fcntl(sockfd_, F_SETFL, flags) < 0){printf("socket set_non_blocking error:error=%d, errmsg = %s", errno, strerror(errno));return false;}return true;
}bool Socket::set_send_buffer(int size)
{int buff_size = size;if (::setsockopt(sockfd_, SOL_SOCKET, SO_SNDBUF, &buff_size, sizeof(buff_size)) < 0){printf("socket set_send_buffer error:error=%d, errmsg = %s", errno, strerror(errno));return false;}return true;
}bool Socket::set_recv_buffer(int size)
{int buff_size = size;if (::setsockopt(sockfd_, SOL_SOCKET, SO_RCVBUF, &buff_size, sizeof(buff_size)) < 0){printf("socket set_receive_buffer error:error=%d, errmsg = %s", errno, strerror(errno));return false;}return true;
}
bool Socket::set_linger(bool active, int seconds)
{struct linger tmp;std::memset(&tmp, 0, sizeof(tmp));tmp.l_onoff = active;tmp.l_linger = seconds;if (::setsockopt(sockfd_, SOL_SOCKET, SO_LINGER, &tmp, sizeof(tmp)) < 0){printf("socket set_linger error:error=%d, errmsg = %s", errno, strerror(errno));return false;}return true;
}bool Socket::set_keepalive()
{int keepalive = 1; // enable keepaliveint keepcnt = 6;  // countint keepintvl = 1; // intervalif (setsockopt(sockfd_, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)) < 0){printf("socket set_keepalive error:error=%d, errmsg = %s", errno, strerror(errno));return false;}// if (setsockopt(sockfd_, SOL_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt)) < 0)// {//   printf("socket set_keepalive error:error=%d, errmsg = %s", errno, strerror(errno));//   return false;// }// if (setsockopt(sockfd_, SOL_TCP, TCP_KEEPINTVL, &keepintvl    , sizeof(keepintvl)) < 0)// {//   printf("socket set_keepalive error:error=%d, errmsg = %s", errno, strerror(errno));//   return false;// }return true;
}bool Socket::set_reuse_addr()
{int optval = 1;if (setsockopt(sockfd_, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0){printf("socket set_reuse_addr error:error=%d, errmsg = %s", errno, strerror(errno));return false;}return true;
}

server_socket.h

#pragma once
#include "socket.h"namespace MySocket
{class ServerSocket : public Socket{public:ServerSocket() = delete;ServerSocket(const string& ip, int port);~ServerSocket() = default;};  
} // namespace name

server_socket.cpp

#include "server_socket.h"
using namespace MySocket;ServerSocket::ServerSocket(const string& ip, int port) : Socket()
{//set_non_blocking();set_recv_buffer(10*1024);set_send_buffer(10*1024);set_linger(true, 0);set_keepalive();set_reuse_addr();bind(ip, port);listen(1024);ip_ = ip;port_ = port;
}

client_socket.h

#pragma once
#include "socket.h"namespace MySocket  
{class ClientSocket : public Socket{public:ClientSocket() = delete;ClientSocket(const string& ip, int port);~ClientSocket()= default;};
}

client_socket.cpp

#include "client_socket.h"
using namespace MySocket;ClientSocket::ClientSocket(const string& ip, int port) : Socket()
{connet(ip, port);ip_ = ip;port_ = port;
}

server.cpp

#include <iostream>
#include "socket/server_socket.h"using namespace MySocket;
int main()
{// // 1. 创建 socket// Socket server;// // 2. 绑定 socket// string ip = "127.0.0.1";// int port = 8080;// server.bind(ip, port);// // 3. 监听 socket// server.listen(1024);ServerSocket server( "127.0.0.1", 8080);while (true){// 4. 接收客户端连接int connfd = server.accept();if (connfd < 0){break;}Socket client(connfd);char buf[1024] = {0};// 5. 接收客户端的数据size_t len = client.recv(buf, sizeof(buf));printf("recv: conn=%d msg=%s\n", connfd, buf);// 6. 向客服端发送数据client.send(buf, len);}// // 7. 关闭 socket// server.close();return 0;
}

client.cpp

// #include <iostream>// #include <cstring>
// #include <sys/socket.h>
// #include <netinet/in.h>
// #include <arpa/inet.h>
// #include <unistd.h>
// #include <string>
// using std::string;
#include "socket/client_socket.h"
using namespace MySocket;int main()
{// // 1. 创建 socket// Socket client;// // 2. 连接服务端// string ip = "127.0.0.1";// int port = 8080;// client.connet(ip, port);ClientSocket client("127.0.0.1", 8080);// 3. 向服务端发送数据string data = "hello world";client.send(data.c_str(), data.size());// 4. 接收服务端的数据char buf[1024] = {0};client.recv(buf, sizeof(buf));printf("recv: %s\n", buf);// // 5. 关闭 socket// client.close();return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5.0)project(hello)set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)set(CMAKE_C_FLAGS_DEBUG "$ENV{CFLAGS} -O2 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -std=c++11 -O2 -Wall -g -ggdb")include_directories(${CMAKE_CURRENT_SOURCE_DIR}/socket)#link_directories(
#  ${CMAKE_CURRENT_SOURCE_DIR}/bluetooth
#)
#file(GLOB_RECURSE SORRCES "socket/*cpp")
set(SORRCES ${CMAKE_CURRENT_SOURCE_DIR}/socket/socket.cpp${CMAKE_CURRENT_SOURCE_DIR}/socket/server_socket.cpp${CMAKE_CURRENT_SOURCE_DIR}/socket/client_socket.cpp)add_executable(server ${SORRCES} server.cpp)
add_executable(client ${SORRCES} client.cpp)

相关文章:

http客户端简单demo

socket.h头文件 #pragma once #include <iostream> #include <cstring> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string> using std::string;namespace MySocket …...

解决UniAD在高版本CUDA、pytorch下运行遇到的问题

UniADhttps://github.com/OpenDriveLab/UniAD是面向行车规划集感知(目标检测与跟踪)、建图(不是像SLAM那样对环境重建的建图&#xff0c;而是实时全景分割图像里的道路、隔离带等行车需关注的相关物体)、和轨迹规划和占用预测等多任务模块于一体的统一大模型。官网上的安装说明…...

ADC、DMA以及串口之间的联系和区别?

ADC、DMA和串口都是嵌入式系统中常用的模块&#xff0c;它们之间有以下联系和区别&#xff1a; 联系&#xff1a; ADC和DMA都是用于数据采集和传输的模块&#xff0c;ADC可以将模拟信号转换为数字信号&#xff0c;DMA可以在不经过CPU的情况下实现数据的高速传输。而串口则是一…...

jupyter lab配置列表清单

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

爱发电 OAuth 登录 SDK for Remix

目录 概要安装使用配置 Remix Auth配置登录跳转配置 callback 回调配置 Demo 测试页配置注销登录 概要 爱发电 OAuth 文档&#xff1a; https://afdian.net/p/010ff078177211eca44f52540025c377 注意一下这里有两个细节&#xff1a; 这里的 OAuth 非标准化 OAuth&#xff0c…...

Wpf 使用 Prism 实战开发Day05

首页设计 1.效果图 一.代码现实 根据页面布局&#xff0c;可以将页面设计成3行&#xff0c;每行中分多少列&#xff0c;看需求而定根据页面内容&#xff0c;设计Model 实体类&#xff0c;以及View Model 1.Index.xaml 页面布局设计 RowDefinition 分行&#xff08;Row&#xf…...

性能压测工具:Locust详解

一、Locust介绍 开源性能测试工具https://www.locust.io/&#xff0c;基于Python的性能压测工具&#xff0c;使用Python代码来定义用户行为&#xff0c;模拟百万计的并发用户访问。每个测试用户的行为由您定义&#xff0c;并且通过Web UI实时监控聚集过程。 压力发生器作为性…...

vmware 修改主机名称 hadoop 服务器环境配置(一)

如何在虚拟机配置主机名称&#xff1a; 1. 如图所示在/etc 文件夹下有个hosts文件。追加映射关系&#xff1a; #关系 ip地址 名称 192.168.164.20 hadoop20 2. 保存后&#xff0c;重启reboot即可...

淘宝店铺订单插旗接口(taobao.trade.memo.update淘宝店铺订单交易备注修改接口)

淘宝店铺订单插旗接口是指可以在淘宝店铺的订单系统中进行订单备注的接口。通过该接口&#xff0c;您可以根据用户的身份&#xff08;买家或卖家&#xff09;&#xff0c;添加相应的交易备注&#xff0c;用于区分不同订单类型等。 具体使用方法可以参考淘宝开放平台的API接口文…...

py文件如何打包成exe?如何压缩文件大小?

打包 要将 Python 文件打包成可执行文件&#xff0c;您可以使用 PyInstaller 这个工具。以下是具体步骤&#xff1a; 首先&#xff0c;确保您已经安装了 PyInstaller。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; pip install pyinstaller进入您的 Python 程序…...

SQL优化相关(持续更新)

常用sql修改 1、LIMIT 语句 在 SQL 查询中&#xff0c;LIMIT 10000, 10 的语句表示从第 10001 行开始&#xff0c;返回 10 行结果。要优化这个查询&#xff0c;可以考虑以下几点&#xff1a; 使用合适的索引&#xff1a;确保涉及到查询条件和排序的列上有适当的索引&#xf…...

Linux学习--limits文件配置详解

/etc/security/limits.conf 是一个配置文件&#xff0c;用于限制用户或进程在系统中可以使用的资源。 语法结构&#xff1a; &#xff1a;指定要应用限制的目标对象&#xff0c;可以是用户&#xff08;&#xff09;、用户组&#xff08;&#xff09;或进程&#xff08;、、<…...

Android Studio 代码上传gitLab

1、项目忽略文件 2选择要上传的项目 3、添加 首次提交需要输入url 最后在push...

【避雷选刊】Springer旗下2/3区,2个月录用!发文量激增,还能投吗?

计算机类 • 好刊解读 前段时间小编分析过目前科睿唯安数据库仍有8本期刊处于On Hold状态&#xff0c;其中包括4本SCIE、4本ESCI期刊&#xff08;&#x1f449;详情可见&#xff1a;避雷&#xff01;又有2本期刊被标记“On Hold”&#xff01;含中科院2区&#xff08;TOP&…...

Linux常用的压缩命令

笑小枫的专属目录 少整花活&#xff0c;直接干货Linux gzip命令语法功能参数 Linux zip命令语法参数 少整花活&#xff0c;直接干货 本文的来源就是因为上篇文章Linux常用的解压命令&#xff0c;解压整了&#xff0c;顺手整理了一波压缩命令。 Linux gzip命令 减少文件大小有…...

如何为VM虚拟机添加D盘

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 在虚拟机上安装Windows10 系统后&…...

C# 16进制颜色转为RGB颜色

#region [颜色&#xff1a;16进制转成RGB] /// <summary> /// [颜色&#xff1a;16进制转成RGB] /// </summary> /// <param name"strColor">设置16进制颜色 [返回RGB]</param> /// <returns></returns> public static System.D…...

【工具】Java计算图片相似度

【工具】Java图片相似度匹配工具 方案一 通过像素点去匹配 /*** * param file1Url 图片url* param file2Url 图片url* return*/public static double img相似度Url(String file1Url, String file2Url){InputStream inputStream1 HttpUtil.createGet(file1Url).execute().…...

GDB调试

GDB调试程序之运行参数输入 以bash运行如下程序命令为例子: $ ./adapter -c FOTON_ECAN.dbc foton_bcan.dbc 方法1:进入gdb,加载程序,执行run命令的时候,后面加上参数 $ gdb (gdb) file adapter Reading symbols from adapter... (gdb) run -c FOTON_ECAN.dbc foton_b…...

swift和OC混编报错问题

1.‘objc’ instance method in extension of subclass of ‘xxx’ requires iOS 13.0.0 需要把实现从扩展移到主类实现。iOS13一下扩展不支持objc 2.using bridging headers with framework targets is unsupported 报错 这个错误通常指的是在一个框架目标中使用桥接头是不…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...