当前位置: 首页 > 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 报错 这个错误通常指的是在一个框架目标中使用桥接头是不…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...