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://www.mzph.cn/news/138936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KVM虚拟机迁移原理与实践

虚拟机迁移 迁移(migration)包括系统整体的迁移和某个工作负载的迁移&#xff0c;系统整体迁移是将系统上的所有软件&#xff0c;包括操作系统&#xff0c;完全复制到另一台物理硬件机器上&#xff0c;而工作负载迁移仅仅迁移特定的工作负载。 虚拟化技术的出现&#xff0c;丰…

android源码添加adb host支持

本文开始参考在 android 上使用 adb client-CSDN博客&#xff0c;在shell中已经可以使用。但当我想在app中用 String command "/data/local/tmp/adb -s 307ef90dc8128844 shell ls";StringBuilder output new StringBuilder();try {Process process Runtime.getR…

Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)

前言&#xff1a;在我的上一篇Linux博客我已经讲了基础指令和权限&#xff0c;现在我们来学习如何在Linux上运行和执行代码 目录 一&#xff0c;yum 二&#xff0c;vim 1&#xff09;命令行模式 2&#xff09;插入模式 3&#xff09;底行模式 三&#xff0c;gcc/g 四&a…

MATLAB的编程与应用,匿名函数、嵌套函数、蒙特卡洛法的掌握与使用

目录 1.匿名函数 1.1.匿名函数的定义与分类 1.2.匿名函数在积分和优化中应用 2.嵌套函数 2.1.嵌套函数的定义与分类 2.2.嵌套函数彼此调用关系 2.3.嵌套函数在积分和微分中应用 3.微分和积分 4.蒙特卡洛法 4.1.圆周率的模拟 4.2.计算N重积分&#xff08;均匀分布&am…

PHP·解决http_build_query模拟浏览器请求多选参数加下标索引的BUG| 无法模拟浏览器多选参数问题

$form_params array(id > 1,ids > [1,2,3], ); $form_params http_build_query($form_params); $form_params preg_replace(/%5B[0-9]%5D/simU, %5B%5D, $form_params);参考 http_build_query — 生成 URL-encode 之后的请求字符串

计算机提示找不到xinput1_3.dll怎么办?6个xinput1_3.dll丢失完美解决方案分享

xinput1_3.dll是Windows操作系统中的一个重要动态链接库文件&#xff0c;它负责处理游戏控制器和其他输入设备的相关功能。当计算机出现xinput1_3.dll缺失的问题时&#xff0c;可能会导致无法正常使用游戏控制器或其他输入设备。下面是针对这个问题的6个解决方法&#xff1a; 方…

基于html+jquery开发的科学计算器(课程作业)

基于html和jquery开发的科学计算器&#xff0c;该科学计算器可进行乘方、开方、指数、对数、三角函数、统计等方面的运算&#xff0c;又称函数计算器。 科学型带有所有普通的函数&#xff0c;所有的函数都分布在键盘上以致于你可以不用通过菜单列表来使用它们。 科学计算器支持…

微服务-我对Spring Clound的理解

官网&#xff1a;https://spring.io/projects/spring-cloud 官方说法&#xff1a;Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…

常用布局以及其优缺点

当涉及到设计和排版时&#xff0c;有许多不同的布局方式可供选择。以下是几种常见的布局方式以及它们的优缺点&#xff1a; 流式布局&#xff08;Fluid Layout&#xff09;&#xff1a; 优点&#xff1a;能够根据屏幕大小自动调整内容&#xff0c;适应不同设备。灵活性高&#…

android:scaleType属性

1. matrix : 不改变原图大小&#xff0c;在ImageView左上角开始显示&#xff0c;超出部分剪裁。 2. center : 不改变原图大小&#xff0c;在ImageView中央显示&#xff0c;超出部分剪裁。 3. centerCrop(剪裁) : 原图按等比例缩放&#xff0c;直至填满整个ImageView&#xff…

分布式搜索引擎ES

文章目录 初识elasticsearch了解ES倒排索引正向索引倒排索引正向和倒排 es的一些概念文档和字段索引和映射mysql与elasticsearch 安装ES部署kibana安装IK分词器扩展词词典停用词词典 索引库操作mapping映射属性索引库的CRUD创建索引库和映射查询索引库修改索引库删除索引库 文档…

微机原理5

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 下列数中最小的数是&#xff08;&#xff09; A. (10111) B. (30) C. (100010) BCD D. 17H 2,下面四个寄存器中,不能作为间接寻址的寄存器是() A. BX B. DX C.…

ChatGPT 如何改变科研之路

《Nature》全球博士后调查[1]中约有三分之一的受访者正在使用人工智能聊天机器人来帮助完善文本、生成或编辑代码、整理其领域的文献等等。 来自巴西的 Rafael Bretas 在日本生活了十多年&#xff0c;日语说得很好。书面日语的各个方面&#xff0c;例如严格的礼貌等级制度&…

【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接

【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接 目录 【Linux基础IO篇】用户缓冲区、文件系统、以及软硬链接深入理解用户缓冲区缓冲区刷新问题缓冲区存在的意义 File模拟实现C语言中文件标准库 文件系统认识磁盘对目录的理解 软硬链接软硬链接的删除文件的三个时间 作者…

2023.11.11 hive中的内外部表的区别

一.内部表操作 ------------------------------1内部---------------------------- --建库 create database hive2; --用库 use hive2; --删表 drop table t1; --建表 create table if not exists t1(id int,name string,gender string ); --复制内部表 --复制表结构:CREATE T…

计算机视觉中目标检测的数据预处理

本文涵盖了在解决计算机视觉中的目标检测问题时&#xff0c;对图像数据执行的预处理步骤。 首先&#xff0c;让我们从计算机视觉中为目标检测选择正确的数据开始。在选择计算机视觉中的目标检测最佳图像时&#xff0c;您需要选择那些在训练强大且准确的模型方面提供最大价值的图…

SpringCloud微服务:Eureka

目录 提供者与消费者 服务调用关系 eureka的作用 在Eureka架构中&#xff0c;微服务角色有两类 Eureka服务 提供者与消费者 服务提供者:一次业务中&#xff0c;被其它微服务调用的服务。(提供接口给其它微服务)服务消费者:一次业务中&#xff0c;调用其它微服务的服务。(调…

C++:容器list的介绍及使用

目录 1.list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator 的使用 1.2.3 list capacity 容量 1.2.4 list element access 访问list元素 1.2.5 list modifiers 修改 1.2.6 迭代器失效 1.list的介绍及使用 1.1 list的介绍 C官网 …

基于ubuntu 22, jdk 8x64搭建图数据库环境 hugegraph--google镜像chatgpt

基于ubuntu 22, jdk 8x64搭建图数据库环境 hugegraph download 环境 uname -a #Linux whiltez 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64 x86_64 x86_64 GNU/Linuxwhich javac #/adoptopen-jdk8u332-b09/bin/javac which java #/adoptopen-jdk8u33…

acwing算法基础之搜索与图论--floyd算法

目录 1 基础知识2 模板3 工程化 1 基础知识 floyd算法的时间复杂度为O(n^3)&#xff0c;它用来解决多源最短路问题。它的原理是基于动态规划。 floyd算法的关键步骤&#xff1a; k从1到n。i从1到n。j从1到n&#xff0c;d[i][j] min(d[i][j], d[i][k] d[k][j])。经过上述三…