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

项目模块三:Socket模块

一、模块设计

1、套接字编程常用头文件展示

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>

#include <fcntl.h>

2、成员函数设计

(1)创建套接字 bool Create()

int socket(int domain, int type, int protocol);

domain:AF_INET:网络通信,AF_LOCAL:本地通信

type:UDP:SOCK_DGRAM,TCP:SOCK_STREAM

protocol:TCP:IPPROTO_TCP

返回值:套接字

(2)绑定地址信息 bool Bind(const string &ip, uint16_t port)

int bind(int sockfd, struct sockaddr *addr, socklen_t len);

sockfd:socket 返回值

addr:输入型参数,传递一个带有服务器信息(IP, 端口号, AF_INET)的结构体对象,具体详见http://t.csdnimg.cn/aY2O0

len:结构体 address 大小

(3)开始监听 bool Listen(int backlog)

int listen(int sockfd, int backlog);

backlog:等待队列,详见内核级理解套接字和全连接队列-CSDN博客

(4)向服务器发起连接 bool Connect(const string &ip, uint16_t port)

int connect(int sockfd, struct sockaddr *addr, socklen_t len);

sockfd:socket 返回值

addr:输入型参数,传递一个带有服务器信息(IP, 端口号, AF_INET)的结构体对象,具体详见http://t.csdnimg.cn/aY2O0

len:结构体 address 大小

(5)接收新连接 int Accept()

int accept(int sockfd, struct sockaddr *addr, socklen_t *len)

addr:输出型参数,得到客户端的信息

len:输出型参数,address大小

返回值:新接收到的连接套接字

(6)接收数据 ssize_t Recv(void *buf, size_t len, int flag)

ssize_t recv(int sockfd, void *buf, size_t len, int flag);

buf:接收缓冲区数据起始地址

len:要接收的数据大小,size_t 无符号数

flag:0阻塞接收,MSG_DONTWAIT非阻塞接收

返回值:ssize_t 有符号数,小于0表示出错,等于0表示没接收到数据,可能是 errno == EAGAIN(缓冲区里面没有数据)或者 errno == EINTR(遇到信号中断进程),大于0表示接收到返回值大小数据。

(7)发送数据 ssize_t Send(void *buf, size_t len, int flag)

ssize_t send(int sockfd, void *buf, size_t len, int flag);

buf:发送缓冲区数据起始地址

len:要发送的数据大小,size_t 无符号数

flag:0阻塞发送,MSG_DONTWAIT非阻塞发送

返回值:ssize_t 有符号数,小于0表示出错,等于0表示没发送数据,可能是 errno == EAGAIN(缓冲区里面没有数据)或者 errno == EINTR(遇到信号中断进程),大于0表示发送返回值大小数据。

(8)创建服务器连接 bool CreateServer(uint16_t port, const string &ip = "0.0.0.0", bool nonblock = false)

具体流程:创建套接字,绑定地址,开始监听,开启地址端口重用,设置非阻塞

设置 ip 缺省 "0.0.0.0" 是为了让服务器接收到来自所有主机的连接。

(9)创建客户端连接 bool CreateClient(uint16_t port, const string &ip)

具体流程:创建套接字,开始连接

(10)关闭连接 bool Close()

close(_sockfd);

(11)开启地址端口重用 void ReuseAddress()

int setsockopt(int sockfd, int level,  int optname, void* val, int vallen)

具体实现:

int val = 1;

setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&val, sizeof int);

val = 1;

setsockopt(_sockfd, SOL_SOCKET, SO_REUSEPORT, (void*)&val, sizeof int);

(12)设置描述符非阻塞 void SetNonBlock()

int fcntl(int fd, int cmd, ...)

具体实现:

获取原有属性:int flag = fcntl(_sockfd, F_GETFL, 0);

设置非阻塞属性:fcntl(_sozkf,d F_SETFL, flag | O_NONBLOCK);

二、代码展示

http://www.lryc.cn/news/464566.html

相关文章:

  • Unity-Shader-语义
  • MFC工控项目实例二十四模拟量校正值输入
  • analysis-ik分词器
  • 开源的、基于内存的键值存储数据库redis详细介绍
  • 三种容器 std::vector、std::map、std::unordered_set 的对比分析
  • Nuxt3 SSR 服务端渲染部署 PM2 全流程(Nest.js 同理)
  • 如何轻松使用pip安装Git仓库中的私有Python模块(使用pip和Git仓库发布和安装私有Python模块)
  • 写 R 包教程
  • 【java】数组(超详细总结)
  • @KafkaListener注解
  • 2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)
  • 第二代GPT-SoVITS V2:让声音克隆变得简单
  • 基于x86_64汇编语言简单教程6: 变量,常量,与运算
  • Vue-router 路由守卫执行流程图
  • ES6 中函数参数的默认值
  • Redis知识应用索引指南
  • ES6扩展运算符
  • 【树莓派 5B】Python 版本切换
  • windows C++-有效使用PPL(五)
  • 【排序】——1.冒泡排序法(含优化)
  • 在MySQL中创建数据库和表
  • Hadoop 安装教程——单节点模式和分布式模式配置
  • 给c++小白的教程10:一维数组
  • 【排序】3.希尔排序法
  • 商品详情数据API接口概述(json数据格式返回参考)
  • Jmeter简介
  • 网页前端开发之HTML入门篇:标题标签 heading
  • 医院信息化与智能化系统(3)
  • 数据结构(线性表)
  • ArcGIS Pro SDK (十八)栅格