项目模块三: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);

二、代码展示

相关推荐
SkyWalking中文站9 小时前
认识 Horizon UI · 15/17:用模板定制控制台
运维·监控·自动化运维
一杯奶茶¥9 小时前
Ubuntu系统镜像各个版本下载Ubuntu镜像合集资源Linux系统镜像乌班图Linux系统镜像
linux·运维·ubuntu·镜像·;inux镜像·ubuntu镜像
运维行者_17 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
2603_9552797018 小时前
Cursor + GitOps:自动化运维新姿势
运维·自动化
Waay18 小时前
面试口述版:个人对 Prometheus 完整理解
运维·学习·云原生·面试·职场和发展·kubernetes·prometheus
三84419 小时前
文件查找/文件压缩/解压缩
linux·运维·服务器
小猪写代码19 小时前
Linux 管道(Pipeline)作业
linux·运维·服务器
桌面运维家19 小时前
如何用半缓存云桌面将服务器硬盘容量扩展至本地终端?
运维·服务器·缓存
Jurio.19 小时前
Codex App SSH 远程开发教程:本地连接远程服务器项目
服务器·ssh·远程工作·codex
激情的学姐19 小时前
【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
运维·nginx