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

二、代码展示

相关推荐
布吉岛的石头30 分钟前
Docker Compose编排实战:多容器应用从开发到生产
运维·docker·容器
身如柳絮随风扬41 分钟前
Nginx 完全指南:核心用途、配置文件详解与动态配置实践
运维·nginx
2601_956139421 小时前
广州VI设计公司哪家强
linux·运维·服务器·python
@encryption1 小时前
RHCE --- 第三节
运维
189228048611 小时前
NV265固态MT29F32T08GSLBHL8-24QMES:B
大数据·服务器·人工智能·科技·缓存
Vinton_Liu1 小时前
NAT 类型详解:四种 NAT 的数据流与原理解析
运维·服务器
一个处女座的程序猿O(∩_∩)O1 小时前
如何保持nginx配置与前端打包dist的路径保持一致、解决页面刷新白屏以及页面跳转问题
运维·前端·nginx
想唱rap1 小时前
五种IO模型和非阻塞IO
linux·运维·服务器·网络·数据库·tcp/ip
环流_1 小时前
nacos:负载均衡 3大核心操作
运维·nacos·负载均衡
阿洛学长2 小时前
CSDN、掘金、简书博客文章如何转为Markdown?
运维·数据库·架构·php·持续部署