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

二、代码展示

相关推荐
pk_xz12345629 分钟前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强31 分钟前
Linux之sed命令详解
linux·运维·服务器
海绵波波10738 分钟前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
九河云2 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock3 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零3 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
云飞云共享云桌面4 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮6 小时前
Linux 使用中的问题
linux·运维
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习