tcp常用网络接口 linux环境
TCP(传输控制协议)网络通信是常见的网络应用形式,它提供了面向连接的、可靠的数据传输服务。TCP通信常用的接口主要包括以下几个方面:
常用接口
1. socket()
int socket(int domain, int type, int protocol);
- 功能:打开一个网络通讯端口,并返回一个文件描述符(socket描述符)。
- 参数:
- domain:地址族,对于IPv4,指定为AF_INET。
type
:套接字类型,对于TCP协议,指定为SOCK_STREAM,表示面向流的传输协议。protocol
:传输层协议类型,对于TCP,通常指定为0。
- 返回值:成功时返回文件描述符(非负整数),失败时返回-1。
2. bind()
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 功能:将套接字与特定的网络地址(IP地址和端口号)绑定。
- 参数:
sockfd
:由socket()返回的文件描述符。myaddr
:指向sockaddr结构体的指针,包含要绑定的地址和端口信息。addrlen
:地址结构体的长度。
- 返回值:成功时返回0,失败时返回-1。
3. listen()
int listen(int sockfd, int backlog);
- 功能:使服务器端的套接字进入监听状态,准备接受客户端的连接请求。
- 参数:
sockfd
:服务器端的套接字描述符。backlog
:设置等待连接队列的最大长度。
- 返回值:成功时返回0,失败时返回-1。
4. accept()
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- 功能:接受一个客户端的连接请求,并返回一个新的套接字描述符,用于与该客户端进行通信。
- 参数:
sockfd
:服务器端的监听套接字描述符。addr
:可选参数,用于存储客户端的地址信息。addrlen
:传入时表示addr的长度,传出时表示实际存储的客户端地址信息的长度。
- 返回值:成功时返回新的套接字描述符,失败时返回-1。
5. connect()
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
- 功能:客户端调用,用于建立与服务器端的连接。
- 参数:
sockfd
:客户端的套接字描述符。addr
:指向服务器地址信息的sockaddr结构体指针。addrlen
:服务器地址结构体的长度。
- 返回值:成功时返回0,失败时返回-1。
6. send() 和 recv()
ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- 功能:
send()
:用于向连接的套接字发送数据。recv()
:用于从连接的套接字接收数据。
- 参数:
sockfd
:套接字描述符。buf
:指向数据缓冲区的指针。len
:要发送或接收的数据长度。flags
:通常设置为0,表示默认行为。
- 返回值:
- 对于
send()
,成功时返回实际发送的字节数,失败时返回-1。 - 对于
recv()
,成功时返回实际接收的字节数,如果连接已关闭且没有数据可读,则返回0,出错时返回-1。
- 对于
7. close()
int close(int fd);
- 功能:关闭套接字,释放相关资源。
- 参数:套接字描述符。
- 返回值:成功时返回0,失败时返回-1。
回显打印(熟悉一下接口)
大致流程
TCP服务器端流程
- 创建套接字(socket)
- 绑定套接字(bind)
- 监听连接(listen)
- 接受连接(accept)
- 数据传输(send/recv)
- 关闭套接字(close)
TCP客户端流程
- 创建套接字(socket)
- 连接服务器(connect)
- 数据传输(send/recv)
- 关闭套接字(close)
代码
ServerMain.cpp 服务器的主函数
#include "TcpServer.hpp"
#include<memory>
int main(int argc, char *argv[])
{if (argc != 2){std::cerr << "Usage: " << argv[0] << " local-port" << std::endl;exit(0);}uint16_t port = std::stoi(argv[1]);std::unique_ptr<Tcpserver> tsvr = std::make_unique<Tcpserver>(port);tsvr->Initserver();tsvr->Loop();return 0;
}
TcpServer.hpp 对Tcp操作分装
#pragma once
#include <iostream>
#include <string>
#include <cstring>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "InterAddr.hpp"
#include "Threadpool.hpp"
enum
{SOCKET_ERROR = 1,BIND_ERROR,LISTEN_ERROR
};
static const uint16_t gport = 8888;
static const int glisten = -1;
static const int gbacklog = 8;
using task_t = std::function<void()>;
class Tcpserver
{
public:Tcpserver(uint16_t port = gport): _port(port), _listensockfd(glisten), _isrunning(false){}void Initserver(){_listensockfd = ::socket(AF_INET, SOCK_STREAM, 0);if (_listensockfd < 0){std::cout << "socket error" << std::endl;exit(SOCKET_ERROR);}struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(_port);local.sin_addr.s_addr = INADDR_ANY;if (bind(_listensockfd, (const sockaddr *)&local, sizeof(local)) < 0){std::cout << "bind error" << std::endl;exit(BIND_ERROR);}if (::listen(_listensockfd, gbacklog) < 0){std::cout << "listen error" << std::endl;exit(LISTEN_ERROR);}std::cout << "init success" << std::endl;}void Loop(){_isrunning = true;while (true){struct sockaddr_in client;socklen_t len = sizeof(client);int sockfd = ::accept(_listensockfd, (struct sockaddr *)&client, &len);if (sockfd < 0){std::cout << "accpet error" << std::endl;exit(1);}InterAddr addr(client);std::cout<<"get a new link, client info"<<addr.AddrStr()<<std::endl;task_t f = std::bind(&Tcpserver::Service, this, sockfd, addr);ThreadPool<task_t>::GetInstance()->Equeue(f);}_isrunning = false;}void Service(int sockfd, InterAddr addr){while (true){char buffer[1024];ssize_t m = ::read(sockfd, buffer, sizeof(buffer) - 1);if (m > 0){buffer[m] = 0;std::string echoserver = "[server echo]#";echoserver += buffer;::write(sockfd, echoserver.c_str(), echoserver.size());}else if (m == 0){std::cout << "clent quit " << addr.AddrStr() << std::endl;break;}else{std::cout << "read error" << std::endl;exit(1);}}::close(sockfd);}~Tcpserver(){}private:uint16_t _port;int _listensockfd;bool _isrunning;
};
InterAddr.hpp LockGuard.hpp Thread.hpp Threadpool.hpp (字节序和线程池)
//interaddr.hpp
#pragma once
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
class InterAddr
{
private:void ToHost(const struct sockaddr_in &addr){port = ntohl(addr.sin_port);ip = inet_ntoa(addr.sin_addr);}private:std::string ip;uint16_t port;struct sockaddr_in _addr;public:InterAddr(const struct sockaddr_in &addr): _addr(addr){ToHost(addr);}bool operator == (const InterAddr &t){return (this->ip == t.ip && this->port == t.port);}std::string Ip(){return ip;}uint16_t Port(){return port;}struct sockaddr_in Addr(){return _addr;}std::string AddrStr(){return ip + ":" + std::to_string(port);}~InterAddr(){}
};//LockGuard.hpp
#pragma once
#include<pthread.h>
class LockGuard
{
private:/* data */pthread_mutex_t* _mutex;
public:LockGuard(pthread_mutex_t* mutex);~LockGuard();
};LockGuard::LockGuard(pthread_mutex_t* mutex):_mutex(mutex)
{pthread_mutex_lock(_mutex);
}LockGuard::~LockGuard()
{pthread_mutex_unlock(_mutex);
}//Thread.hpp
#pragma once
#include <iostream>
#include <string>
#include <pthread.h>
#include <functional>
namespace ThreadMoudle
{using func_t = std::function<void(const std::string &)>;class Thread{public:void Execute(){isrunning = true;_func(_name);isrunning = false;}public:Thread(const std::string name, func_t func): _name(name), _func(func){}static void *ThreadRoutine(void *args){Thread *a = static_cast<Thread *>(args);a->Execute();return nullptr;}bool Start(){int n = pthread_create(&_tid, nullptr, ThreadRoutine, (void *)this);if (n != 0){return false;}else{return true;}}std::string Status(){if (isrunning){return "running";}else{return "stop";}}void Stop(){if (isrunning){pthread_cancel(_tid);isrunning = false;}}void Join(){pthread_join(_tid, nullptr);}std::string Name(){return _name;}~Thread(){}private:std::string _name;pthread_t _tid;bool isrunning;func_t _func;};} //Threadpool.hpp
#pragma once
#include <iostream>
#include <unistd.h>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include "LockGuard.hpp"
#include "Thread.hpp"
using namespace ThreadMoudle;
static const int gdefaultnum = 5;
// pthread_mutex_t _fmtx=PTHREAD_MUTEX_INITIALIZER;
template <class T>
class ThreadPool
{
private:void LockQueue(){pthread_mutex_lock(&_mutex);}void UnlockQueue(){pthread_mutex_unlock(&_mutex);}void Wakeup(){pthread_cond_signal(&_cond);}void WakeupAll(){pthread_cond_broadcast(&_cond);}void Sleep(){pthread_cond_wait(&_cond,&_mutex);}bool IsEmpty(){return _task_queue.empty();}void HandlerTask(const std::string name){while (1){LockQueue();while (IsEmpty() && _isrunning){sleep_thread_num++;Sleep();sleep_thread_num--;}if (IsEmpty() && !_isrunning){UnlockQueue();break;}T t = _task_queue.front();// std::cout<<&t<<std::endl;_task_queue.pop();UnlockQueue();// LockGuard lockguard(&_fmtx);t();}}void Init(){func_t func = std::bind(&ThreadPool::HandlerTask, this, std::placeholders::_1);for (int i = 0; i < _thread_num; i++){std::string name = "Thread-" + std::to_string(i + 1);_threads.emplace_back(name, func);}}void Start(){_isrunning = true;for (auto &threadd : _threads){threadd.Start();}}ThreadPool(int thread_num = gdefaultnum): _thread_num(thread_num), _isrunning(false), sleep_thread_num(0){pthread_mutex_init(&_mutex, nullptr);pthread_cond_init(&_cond, nullptr);}ThreadPool(const ThreadPool<T> &) = delete;void operator=(const ThreadPool<T> &) = delete;public:void Stop(){LockQueue();_isrunning = false;WakeupAll();UnlockQueue();}static ThreadPool<T> *GetInstance(){LockGuard lockguard(&_sig_mutex);if (_tp == nullptr){_tp = new ThreadPool();_tp->Init();_tp->Start();}return _tp;}void Equeue(const T& in){LockQueue();if (_isrunning){_task_queue.push(in);if (sleep_thread_num > 0){Wakeup();}}UnlockQueue();}~ThreadPool(){pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond);}private:int _thread_num;std::vector<Thread> _threads;std::queue<T> _task_queue;bool _isrunning;int sleep_thread_num;pthread_mutex_t _mutex;pthread_cond_t _cond;static ThreadPool<T> *_tp;static pthread_mutex_t _sig_mutex;
};template <class T>
ThreadPool<T> *ThreadPool<T>::_tp = nullptr;
template <class T>
pthread_mutex_t ThreadPool<T>::_sig_mutex = PTHREAD_MUTEX_INITIALIZER;
ClienMain.cpp 客户端
#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include "InterAddr.hpp"
int main(int argc, char *argv[])
{if (argc != 3){std::cerr << "Usage: " << argv[0] << "server-ip local-port" << std::endl;exit(0);}std::string serverip = argv[1];uint16_t port = std::stoi(argv[2]);int sockfd = ::socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){std::cerr << "socket error" << std::endl;exit(1);}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(port);if (::inet_pton(AF_INET, serverip.c_str(), &server.sin_addr.s_addr) <= 0){std::cerr << "inet_pton error" << std::endl;exit(1);}if (::connect(sockfd, (const struct sockaddr *)&server, sizeof(server)) < 0){std::cerr << "connect error" << std::endl;exit(1);}while (true){std::string message;std::cout<<"Enter #";std::getline(std::cin,message);::write(sockfd,message.c_str(),message.size());char buffer[1024];int n=::read(sockfd,buffer,sizeof(buffer));if(n > 0){buffer[n] = 0;std::cout << buffer << std::endl;}else{break;}}::close(sockfd);return 0;
}
相关文章:

tcp常用网络接口 linux环境
TCP(传输控制协议)网络通信是常见的网络应用形式,它提供了面向连接的、可靠的数据传输服务。TCP通信常用的接口主要包括以下几个方面: 常用接口 1. socket() int socket(int domain, int type, int protocol); 功能࿱…...

第10节课:JavaScript基础——网页交互的魔法
目录 JavaScript的作用JavaScript的基本语法基本语法规则变量、数据类型和运算符变量数据类型运算符 实践:使用JavaScript增强网页功能结语 JavaScript是一种高级的、解释型的编程语言,它使得网页能够从静态文档转变为具有动态交互性的应用程序。本节课将…...

springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后
汽车租赁系统是针对目前汽车租赁管理的实际需求,从实际工作出发,对过去的汽车租赁管理系统存在的问题进行分析,完善客户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高&…...

.NET C# 将文件夹压缩至 zip
.NET C# 将文件夹压缩至 zip 文章目录 .NET C# 将文件夹压缩至 zip1 使用 System.IO.Compression1.1 环境1.2 压缩文件夹1.2.1 简单压缩1.2.2 复杂压缩 1.3 解压缩1.3.1 简单解压缩1.3.2 复杂解压缩 2 使用 SharpZipLib2.1 环境2.2 压缩文件夹2.3 解压缩 3 压缩效果简单测试 1 …...

软考基本介绍
一,基本了解 计算机技术与软件专业技术资格(水平)考试(简称软件考试)为国家级考试。 考试设置了27个专业资格,涵盖5个专业领域, 3个级别层次(初级、中级、高级)。 中国计算机技术职业…...

【Vue】vue3 中使用 ResizeObserver 监听元素的尺寸宽度变化
要监听 div 宽度的变化,可以使用 ResizeObserver 接口。ResizeObserver 允许你观察一个或多个元素的尺寸变化,并在发生变化时执行回调函数。这种方法比使用 MutationObserver 更专注于尺寸变化,且不受元素属性变化的影响。 使用 ResizeObserv…...

信息安全专业好吗?
22 届的 211 信安毕业生,目前在读研(虽然已经和安全没关系),整体来看大部分高校的信安都是作为计算机的附属专业存在的,除了极具特色的几个高校,例如山大的密码学,广州大学某院士加持的网络安全…...

梧桐数据库(WuTongDB):数据库中元数据表的常见信息
元数据表是数据库系统中用于存储和管理元数据的表。这些表提供关于数据库对象(如表、列、索引、视图、存储过程等)的详细信息。以下是元数据表的一些常见类型及其详细解释: 常见元数据表类型 表信息表 表名:TABLES描述࿱…...

在 Linux 9 上安装 Oracle 19c:克服兼容性问题 (INS-08101)
Oracle 数据库 19c 的基础版本 (19.3) 发布的时候还没有 Linux 9 ,因此在Linux 9上面安装Oracle 19c会遇到很多兼容性问题。本文将探讨如何解决这些问题。 安装步骤 设置环境变量以绕过操作系统检查: Oracle 19.3 安装程序无法识别 Linux 9。 [WARNIN…...

【踩坑】pytorch中的索引与copy_结合不会复制数据及其解决方案
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景知识 实验验证 结论分析 错误案例 处理方法 注意事项 附加说明 基本索引返回视图 高级索引返回副本 赋值操作都是原地操作 以下内容…...

十六、【Python】基础教程 - 【Flask】网络编程开发
目录 前言 Flask 基础概念 安装 Flask 示例:创建一个 Flask Web 应用 运行 Flask 应用 更复杂的例子 测试新功能 前言 Flask 是一个用 Python 编写的微型 Web 框架,它以简单性和灵活性著称,非常适合快速开发小型到中型的 Web 应用。F…...

C#初级——List 容器
容器 在C#中,容器通常指的是用于存储和组织数据的集合类。 本文介绍的容器是动态数组:List<T> 内部使用数组来存储元素,当添加元素超出当前数组容量时,会自动调整大小(扩容)。 list容器 List<&g…...

serial靶机教程
靶机下载地址 https://download.vulnhub.com/serial/serial.zip 主机发现 arp-scan -l 端口扫描 nmap 192.168.229.131 -A 根据对⽐可知serial的⼀个ip地址为192.168.47.143 该靶机开启了22端⼝和80端⼝ 对⽹站进⾏⼀个访问,⼤概意思为这是对新的cookie处理程序…...

【Linux-MISC设备】
目录 1. MISC设备2. MISC蜂鸣器实验 1. MISC设备 MISC设备的主设备号为10.MISC设备会自动创建cdev,不需要再手动创建。MISC设备是基于platform的. MISC驱动的编写的核心就是初始化miscdevice结构体变量,然后用misc_register函数向内核注册,…...

【随笔】VRRP+MSTP
虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP) 设计采用主备模式,将VRRP组内多个路由设备都映射为一个虚拟路由设备。 一个VRRP组中只能由一台处于主控角色的路由器,可以有一个或多个备份角色的路由器。…...

vue 动态增删行,并form表单校验(附v2\v3)
Vue3 组件用的 ant 可以换成你们用,主要是form校验 前端代码 <a-formref"formRef":model"formData":label-col-props"{ span: 5 }":wrapper-col-props"{ span: 17 }"><a-row><a-form-itemlabel"角色…...

计算机网络的基本概念
IP地址(Internet Protocol Address)是指在计算机网络中每个设备的唯一标识符。它用于区分不同设备并在网络中进行数据包的路由。我们平常所使用的IP地址主要版本: IPv4 格式: 由四个整数(0到255)组成,以点…...

Python 爬虫项目实战三:GitHub 用户信息抓取与分析
一、项目背景 爬虫技术不仅限于获取网页内容,还可以用于获取和分析特定网站的用户信息。本文将演示如何使用Python编写爬虫程序,从GitHub网站抓取用户信息,并进行简单的数据分析。 二、环境准备 在开始之前,请确保你已经安装了…...

xtrabackup搭建MySQL 8.0 主从复制
xtrabackup搭建MySQL 8.0 主从复制 安装MySQL 8.0.37安装xtrabackupGTIDs初始化从库参考:GTID概述GTID相较与传统复制的优势GTID自身存在哪些限制GTID工作原理简单介绍如何开启GTID复制GTID与传统模式建立复制时候语句的不同点传统复制GTID复制 GTID同步状态简单解析…...

Java程序员接单分享
作为一名Java程序员,这阵子通过承接些小型项目,我顺利跨过了月薪破万的门槛。这些项目虽小,却如同磨刀石般,让我在实战中发现了自身技术栈的棱角与不足,尤其是意识到了在Java这一浩瀚技术海洋中的诸多未知领域。我深知…...

【HarmonyOS NEXT星河版开发学习】小型测试案例01-今日头条置顶练习
个人主页→VON 收录专栏→鸿蒙开发小型案例总结 基础语法部分会发布于github 和 gitee上面 前言 本系列可能是博客首发,鸿蒙开发星河版是一个全新的版本,由于参考视频较少鸿蒙开发不被重视导致csdn上面并没有全套的学习路线,…...

C语言----计算开机时间
计算开机时间 实例说明 编程实现计算开机时间,要求在每次开始计算开机时间时都能接着上次记录的结果向下记录。 实现过程: 1. 在TC中创建一个C文件。 2. 引用头文件,代码如下: #include <stdio.h> 3. 定义结构体time,用来…...

批发行业进销存-登录适配 android 横竖屏幕 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
一、横竖屏切换的意义 以下是移动端横屏竖屏可切换在进销存中的一些重要应用: a、数据录入与查看 在录入商品信息、库存数量等大量数据时,横屏模式可以提供更宽阔的输入区域,减少输入错误。例如,在输入长串的商品编码或详细的商…...

js功能(1)
1、readonly 应用于元素:readonly 可以应用于 <input> 和 <textarea> 元素。 用户界面表现:当元素设置为 readonly 时,用户不能更改输入框中的值,但可以选中和复制文本,且表单包含该输入字段的值可以被提交…...

微信小程序乡村医疗系统,源码、部署+讲解
目录 摘 要 Abstract 1 绪论 1.1 研究背景及意义 1.2 研究现状 1.3 研究内容 2 相关技术介绍 2.1 Java 语言 2.2 MySQL 数据库 2.3 Spring Boot 框架 2.4 B/S 结构 2.5 微信小程序 3 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术可行性…...

完美解决pip命令版本冲突导致对应版本模块包无法安装的问题
解决步骤 使用pip更新/降低指定模块包命令格式降低pip自身至指定版本的命令再次换源安装指定模块包 在对 FasterNet 这篇论文源码复现过程中,我们首先需要安装相关依赖文件( path/to/your/requirements.txt) -extra-index-url https://down…...

5.1-软件工程基础知识-软件工程概述
软件工程诞生原因 了解 早期的软件:主要是指采用个体工作方式实现的程序。第一次软件危机:20世纪60年代中期 典型表现有软件质量低下、项目无法如期完成、项目严重超支等因为软件而导致的重大事故时有发生。 软件工程的诞生:1968年在NATO会…...

极简聊天室-websocket版
再写一个极简聊天室的websocket版,在本例中,websocket仅用于服务器向客户端传输信息,客户端向服务器发送信息是传统的http post方式,用axios来实现的,当然websocket本身是支持双向通信,主要是为了方便跟前面…...

QT学生管理系统 开发文档
目录 第一章 UI界面设计与开发 登录界面 主界面 UI美化 第二章 数据库设计与开发 数据库设计 连接数据库 数据库功能设计 sql语句设计 查询所有学生数量 查询第几页学生数据 删除学生 修改学生信息 清空学生表 添加单个用户 删除单个用户 修改用户权限 查询所有用户…...

【五大海内外高校支持】2024年数字经济与计算机科学国际学术会议(DECS2024)
大会官网:www.icdecs.net 大会时间:2024年9月20-22日 大会地点:中国-厦门 截稿日期:详情见官网 支持单位 马来西亚理工大学 北京科技大学经济管理学院 南京信息工程大学 马来西亚敦胡先翁大学 大会嘉宾 大会主席 罗航…...