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

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...