首页 > 其他分享 >项目模块三:Socket模块

项目模块三:Socket模块

时间:2024-10-19 13:48:11浏览次数:10  
标签:Socket 项目 int void len flag bool 模块 sockfd

一、模块设计

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);

二、代码展示

标签:Socket,项目,int,void,len,flag,bool,模块,sockfd
From: https://blog.csdn.net/qhy850716/article/details/143067584

相关文章

  • 如果做项目提案书
    封面:包括项目名称、投标单位名称、联系人信息和日期。目录:目录应详细列出所有章节和子章节及其页码。方便评审人员查阅。投标函:简要说明投标意向,并概述投标书的主要内容。例文----------------------------------------------------------------------[投标日期]尊敬的[招标单位......
  • 如何创建Electron + Vue3项目, 并调用C# dll
    依赖环境当前系统环境为win11,真正上手才知道环境问题才是最大的问题,希望本文能帮你节约时间。本文参考以下资料https://www.electronforge.io/guides/framework-integration/vue-3perplexity.ai和kimi.ai提供其他相关资料nodejs在开发前需要确定你要调用的dll是32位还是64位......
  • 【开发心得】筑梦上海:项目风云录(8)
    目录开心的日子总是过的快秋天终于来了。感谢欣赏,未完待续。。。不知不觉已经写到第8篇,感谢大家的关注和阅读。这一篇,公交项目已经走向尾声,感觉有很多东西还没有写出来。好在印象深刻的事情都记录了,之前走了很多坑,也算是项目开发的避坑指南吧。开心的日子总是过的快上......
  • 模块联邦-vite-plugin-federation
    主应用"@originjs/vite-plugin-federation":"^1.3.6"vite.config.tsbuild:{emptyOutDir:false,chunkSizeWarningLimit:1000,minify:false,cssCodeSplit:!pluginOption.isUnionSub,//sccscopedtarget:[&quo......
  • HFSS实战项目——高带外抑制特性SIW带通滤波器
    1.引言高频应用中,由于波长过小,过于高的容差要求常常使微带线失效。波导就常用于高频情况,但是波导体积大,不易于集成。所以产生了一种新的观点:基片集成波导SIW。SIW是介于微带与介质填充波导之间的一种传输线。 SIW兼顾传统波导和微带传输线的优点,可实现高性能微波毫米波平面......
  • springboot科研项目验收管理系统(11722)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • TCP-UDP-Socket调试工具以及使用教程(亲测好用!)
    前言TCP-UDP老程序都不陌生吧,面试常问。所以在网络编程与网络应用开发的过程中,调试是一个至关重要的环节,它帮助开发者确保数据能够准确无误地在不同节点之间传输。尤其当涉及到TCP/IP、UDP等底层网络通信协议时,面对复杂的连接建立、数据流控制及错误处理等问题,拥有一款强大且专业......
  • git项目之间的commit同步
    有两个类似的项目,他们基于一套代码fork出来的,当一个项目改动了时,另一个项目想同步之前项目时,我们用补丁的方式来解决。首先,在被复制的项目中执行,gitformat-patchAcommit..Bcommit,这个会生成A提交(不包含)到B提交之间所有的提交commit补丁,每一次的提交会生成一个.pat......
  • 18. 模块
    一、什么是模块  模块化指将一个完成的程序分解为一个一个小的模块。通过将模块组合,来搭建一个完整的程序。如果不采用模块化,那么所有的代码将统一保存到一个文件中。采用模块化后,将程序分别编写到多个文件中。使用模块化后,我们可以把代码进行复用,这方面后序的开发和维护。二......
  • 【第三版 系统集成项目管理工程师】第17章 法律法规和标准规范
    持续更新。。。。。。。。。。。。。。。【第三版】第17章法律法规和标准规范17.1法律法规17.1.1法与法律P5801.基本概念-P5802.本质与特征-P58017.1.2法律体系1.世界法律体系(非重点)-P5802.中国特色社会主义法律体系-P58117.1.3法的效力1.对象效力-P5822.空......