Linux 操作系统TCP、UDP

1、TCP服务器编写流程

头文件:

#include <sys/socket.h>

1.1 创建套接字

函数原型:

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

参数:

        domain: 网域
               AF_INET : IPv4
               AF_INET6 : IPv6
               AF_UNIX : 本地通讯

type:选择传输协议  tcp/udp

                SOCK_STREAM ; tcp
                SOCK_DGRAM : udp

protocol: 基本废弃, 一般赋 0
返回值: 成功返回描述网络套接字 sockfd, 失败返回-1
举例: 创建描述网络的套接字:

int sfd = socket(AF_INET,SOCK_STREAM,0);

1.2 绑定

头文件:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

作用:绑定一个端口和IP地址,使套接口与指定的端口号和IP地址相关联

函数原型:

int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

参数:

        sockfd 为前面 socket 的返回值, 描述网络的套接字
        my_addr:封装 ip 地址和端口号

struct sockaddr //一般很少用
{unsigned short int sa_family; // AF_INET。char sa_data[14]; //IP 和端口
};
struct sockaddr_in //常用的结构体
{unsigned short int sin_family; //AF_INEuint16_t sin_port; //使用的 port 编号struct in_addr sin_addr; // IP 地址unsigned char sin_zero[8]; //未使用
};

端口:10000-65535之间随意选

转化:

uint32_t htonl(uint32_t hostlong);//本函数将一个 32 位数从主机字节顺序转换成无符号长整型网络字节顺序
uint16_t htons(uint16_t hostshort);//将一个无符号短整型的主机数值转换为网络字节顺序
uint32_t ntohl(uint32_t netlong);//将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
uint16_t ntohs(uint16_t netshort);//将一个 16 位数由网络字节顺序转换为主机字节顺序。

IP的填写方式:

struct in_addr
{uint32_t s_addr; //=inet_addr("192.168.1.22");
};

返回值:成功则返回0,失败返回-1

举例:

#define PORT 33333
#define IP "192.168.110.123"
struct sockaddr_in ser_addr;
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(PORT);
ser_addr.sin_addr.s_addr = inet_addr(IP);
inet_aton(“192.168.1.22”,&ser_addr.sin_addr);
bind(sfd,(struct sockaddr)&ser_addr,sizeof(ser_addr));

1.3 监听

作用:设置允许的最大连接数(瞬间处理的阀值),listen函数。

使用服务器的这个端口和IP处于监听状态,等待网络中某一客户机的连接请求。如果客户端哟连接请求,端口就会接受这个链接。

函数原型:

int listen(int sockfd, int backlog);

参数:

        sockfd 为前面 socket 的返回值, sfd
        backlog 指定同时能处理的最大连接要求, 通常为 10 或者 5。 最大值可设至 128( 不是最多可以连接 128个客户端, 是一个瞬时处理的阈值)
返回值: 成功则返回 0, 失败返回-1

1.4 等待客户端连接

函数原型:

int accept(int sockfd, struct sockaddr *addr,socklen_t *addrlen);

参数:

        sockfd 为前面 socket 的返回值, 即 sfd
        addr: 提供空间, 用于接受客户端的 ip 地址和端口号
        addrlen: 第二个参数大小

返回值:

        返回新的套接字描述符, 专门用于与建立的客户端通信
        失败-1;

举例:

struct sockaddr_in cli_addr = {0};
socklen_t len = sizeof(cli_addr);
int cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len);

1.5 读写函数

可以使用read和write函数进行。

写函数

函数原型;

ssize_t send(int s, const void *buf, size_t len, int flags);

参数:

        s: 通信套接字
        buf: 要发送的数据缓冲区
        len: 数据长度
        flags: 一般赋 0 .阻塞

返回值:成功返回真正发送的数据长度,失败-1.

读函数

函数原型:

ssize_t recv(int s, void *buf, size_t len, int flags);

参数:

        s: 通信的套接字
        buf:存放接收数据的缓冲区
        len: 数据长度
        flags: 一般赋 0 .阻塞

返回值:成功返回真正接收的数据长度,失败-1.

2 TCP客户端编写流程

2.1 创建套接字

头文件:

#include <sys/socket.h>

函数原型:

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

参数:

        domain: 网域
                AF_INET : IPv4
                AF_INET6 : IPv6
        type: 选择传输协议 tcp /udp
                SOCK_STREAM ; tcp
                SOCK_DGRAM : udp
        protocol: 基本废弃, 一般赋 0

返回值:成功返回套接字fd,失败返回-1

2.2 连接

函数原型:

int connect(int sockfd, const struct sockaddr*serv_addr, socklen_t addrlen);

参数:

    sockfd 为前面 socket 的返回值, 即 fdserv_addr 为结构体指针变量, 存储着远程服务器的 IP 与端口号信息。addrlen 表示结构体变量的长度

返回值:成功则返回0,失败返回-1

举例:

    int fd = socket(AF_INET,SOCK_STREAM,0);#define PORT 33333#define IP "192.168.110.123"struct sockaddr_in ser_addr;ser_addr.sin_family = AF_INET;ser_addr.sin_port = htons(PORT);ser_addr.sin_addr.s_addr = inet_addr(IP);connect(fd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));

TCP 问题: 当服务器结束之后, 再次运行会出现 bind 错误(地址被占用)
解决办法:

      int sfd = socket(AF_INET,SOCK_STREAM,0);


创建套接字之后, 用:

int val = 1;
setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val));
setsockopt(sfd,SOL_SOCKET,SO_REUSEPORT,&val,sizeof(val));

3.UDP

特点:非面向连接,不可靠传输,传输速率高

分别有:

单播  --  一对一                广播  --  一对多          组播  --  多对多

3.1 单播

        UDP不像TCP。无需在连接状态下交换数据,因此基于UDP的接收方和发送发也无需经过连接过程。也就是说,不必调用listen()和accept()函数。UDP中有创建套接字的过程和数据交换的过程。不管是接收方还是发送方都只需要1个套接字。

3.1.1 创建套接字
头文件:

#include <sys/socket.h>

函数原型:

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

参数:

        domain: 网域
        AF_INET : IPv4
        AF_INET6 : IPv6
        type: 选择传输协议 tcp /udp
        SOCK_STREAM ; tcp
        SOCK_DGRAM : udp
        protocol: 基本废弃, 一般赋 0
返回值: 成功返回套接字 fd, 失败返回

3.1.2 bind:绑定自己的IP和端口

发送方:socket   同接收方

函数原型:

ssize_t sendto( int s, //套接字const void *buf, //要发送的数据的首地址size_t len, //数据的大小int flags, // 0const struct sockaddr *to,//接收方的 IP 和 portsocklen_t tolen //上一个参数的大小
);

返回值:成功返回真正发送的数据长度,失败-1

ssize_t recvfrom(int s, //套接字void *buf, //接受的内容存放的位置的首地址size_t len, //接收的大小int flags, //0struct sockaddr *from, //提供空间即可, 存放发送方的 IP 和 PORTsocklen_t *fromlen//上一个参数的大小, 但是填指针
);

返回值:成功返回真正接收的数据长度, 失败-1

3.2 广播

udp具有广播功能,即一个发送方,多个接收方;

广播:处于局部网络中的所有设备都可以接收消息

广播的地址:网络号不变,主机号为255 

socket 创建的 UDP 套接字支持组播和广播, 但是想要使用广播, 必须用 setsockopt 设置广播的功能。

接收方:
        1》 创建套接字 socket UDP
        2》 绑定 IP 和 PORT IP 填 INADDR_ANY
        3》 recvfrom 接收

发送方:

        1》 创建套接字 socket UDP
        2》 开启广播功能: setsockopt

开启广播功能函数

int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);

函数功能:设置套接字的选项

参数:

sockfd创建的套接字

        level--选项所在的级别:
        想让套接字有广播功能, 就必须把 level 设置为 SOL_SOCKET
                SOL_SOCKET -- 广播功能所在的级别
        optname--选项所在的名称:
                SO_BROADCAST (广播功能)
        optval: 整数的地址
                int num = 1;//开启功能 &num
                0--失能(关闭此功能,系统默认关闭)
                1--使能(开启此功能)
        optlen: optval 的大小 //sizeof(num);

举例:

int a = 1;
setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&a,sizeof(int));

sendto 发送


3.3 多播

对一组特定的主机发送消息 比如: 直播, 多播(D 类), IP 地址分为: 224.0.0.0~239.255.255.255

1》 创建套接字 socket UDP
 

 int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

函数功能: 设置套接字的选项
参数:
        sockfd: socket 创建的套接字
        level: 级别
        SOL_SOCKET : 广播级别
        IPPROTO_IP : 组播级别

        optname: 选项由 level 决定, level 选的是 IPPROTO_IP, optname 有两种选择
        IP_ADD_MEMBERSHIP 加入组播
        IP_MULTICAST_IF 创建组播
        optval: 设置参数 由 optname 决定
        当 optname 为:
                IP_ADD_MEMBERSHIP( 加入组播) , optval 是 struct ip_mreqn 这个结构体
                IP_MULTICAST_IF ( 创建组播) , optval 也是 struct ip_mreqn 这个结构体

struct ip_mreqn
{struct in_addr imr_multiaddr;//多播组的地址 224.0.0.0-239.255.255.255 structin_addr imr_address;//本地的 IP 地址, 填固定的宏 INADDR_ANY 即可int imr_ifindex; //网卡编号( 物理硬件地址) , 可以用物理硬件 ID 函数:                                                     if_nametoindex("ens33"); 其中 ens33 是网卡的
名字, 通过名字获取编号
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fswatch工具:跟踪Linux中的文件和目录更改

fswatch是一个跨平台的文件更改监视器&#xff0c;当指定文件或目录的内容被更改或修改时&#xff0c;它会收到通知警报。 fswatch在不同的操作系统上执行多种类型的监视器&#xff0c;例如&#xff1a; 基于 Apple OS X 的文件系统事件 API 构建的监视器。基于kqueue的监视器…

WPF之DataGird应用

1&#xff0c;DataGrid相关属性 GridLinesVisibility&#xff1a;DataGrid网格线是否显示或者显示的方式。HorizontalGridLinesBrush&#xff1a;水平网格线画刷。VerticalGridLinesBrush&#xff1a;垂直网格线画刷。HorizontalScrollBarVisibility&#xff1a;水平滚动条可见…

ASP.NET MVC 如何使用 Form Authentication?

前言 .NET 的 Form Authentication 是一种基于表单的简单且灵活的身份验证机制&#xff0c;用户通过输入用户名和密码来登录应用程序&#xff0c;并且通过配置来控制用户访问权限。 在使用 Form Authentication 时&#xff0c;我们需要在 web.config 文件中配置身份验证和授权…

Spring Cloud Consul 4.1.1

该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法&#xff0c;为 Spring Boot 应用程序提供 Consul 集成。通过一些简单的注释&#xff0c;您可以快速启用和配置应用程序内的常见模式&#xff0c;并使用基于 Consul 的组件构建大型分布式系统。提供的模式…

Spark云计算平台Databricks使用,第一个Spark应用程序WordCount

1 上传文件 上传words.txt文件&#xff1a;Spark云计算平台Databricks使用&#xff0c;上传文件-CSDN博客 上传的文件的路径是/FileStore/tables/words.txt&#xff0c;保存在AWS的S3 hello world hello hadoop hello world hello databricks hadoop hive hbase yarn spark …

利用BACnet分布式IO控制器优化Niagara楼宇自动化系统

在智能建筑领域&#xff0c;随着物联网技术的飞速发展&#xff0c;如何实现高效、灵活且安全的楼宇自动化控制成为了行业关注的焦点。BACnet IP分布式远程I/O模块&#xff0c;作为这一领域的创新成果&#xff0c;正逐渐成为连接智能建筑各子系统的关键桥梁&#xff0c;尤其在与…

springboot -多数据源管理方案

多数据源的配置有多种方式 方式一 、依赖dataSource的配置 1.建立多数据源配置 spring:# 数据源配置datasource:pdm:driver-class-name: oracle.jdbc.driver.OracleDriverjdbc-url: jdbc:oracle:thin:10.216.xxx.xxx:3000:orclusername: cfpdmpassword: capecapp:driver-cla…

走进CHEN MEI HUA的设计哲学:书写东方女性力量与态度的时尚篇章

在时尚的舞台中央&#xff0c;品牌不止是商品&#xff0c;更是故事的讲述者、文化的传承者。CHEN MEI HUA&#xff0c;一个源自中国上海的高端女装品牌&#xff0c;以其独特的设计理念及文化内核&#xff0c;成为了时尚界一颗耀眼的明珠。今天&#xff0c;让我们一起走进CMH的世…

如何安装ElasticSearch及相关件

一、简介 ElasticSearch是什么&#xff1f; elasticsearch简写es&#xff0c;es是一个高扩展、开源的全文检索和分析引擎&#xff0c;它可以准实时地快速存储、搜索、分析海量的数据。 ElasticSearch 插件 elasticsearch-head是一款专门针对于elasticsearch的客户端工具&am…

3W 1.5KVDC 隔离单输出 DC/DC 电源模块 ——TPL-3W 系列

TPL-3W系列是一款额定功率为3W的隔离产品&#xff0c;国际标准引脚&#xff0c;宽范围工作温度–40℃ 到 105℃&#xff0c;在此温度范围内都可以稳定输出3W&#xff0c;并且效率非常高&#xff0c;高达88%&#xff0c;同时负载调整率非常低&#xff0c;对于有输出电压精度有要…

ATA-300/3000系列功率放大器全新升级!免费样机“试”不宜迟!

2024年4月&#xff0c;Aigtek安泰电子ATA-300/3000系列功率放大器&#xff0c;迎来了进一步升级&#xff0c;最大输出功率可达1000Wp&#xff0c;最大输出电流20Ap&#xff0c;四象限输出&#xff0c;可驱动功率型负载。新产品的功率密度和可靠性都更高&#xff0c;能够进行的进…

【漏洞复现】某小日子太阳能系统DataCube3审计

漏洞描述 某小日子太阳能系统DataCube3终端测量系统 多个漏洞利用方式 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进…

华普检测温湿度监测系统建设方案

一、项目背景 随着医疗行业的蓬勃发展&#xff0c;药品、试剂和血液的储存安全直接关系到患者的健康。根据《药品存储管理规范》、《医疗器械冷链&#xff08;运输、贮存&#xff09;管理指南》、《疫苗储存和运输管理规范》和《血液存储要求》等相关法规&#xff0c;医院药剂…

uni-app(一):云端插件的使用(Android)

云端插件的使用 1.创建项目2.购买插件3.选用插件4.进入 uni-app 配置文件修改支持 CPU 类型5.制作支持 App 的自定义调试基座6.等待自定义调试基座打包完成7.编写调用插件代码8.运行 1.创建项目 2.购买插件 3.选用插件 4.进入 uni-app 配置文件修改支持 CPU 类型 5.制作支持 Ap…

【valse 2024】开幕式内容汇总(持续更新)

提示&#xff1a;更新中&#xff0c;一周左右更新完毕。需要具体课件的可私信 文章目录 一、大会主旨报告主旨报告-1:大模型时代的机遇和挑战主旨报告-2:以深度学习框架为牵引促进自主 AI生态发展主旨报告-3:从洞穴的影子到智能的光辉--连接和交互方式的改变塑造未来生活 二、大…

对camera raw中的纹理和清晰度的内容的修正(之前的内容写错了,懒得改了重新写一篇)

之前对于环的解释&#xff0c;不太行&#xff0c;这里我给出进一步地说明。 首先对环的解释: 我这里说的环指的是频域段中的ai变化的时候对图像像素的变化的极大的影响程度的环状效果&#xff0c;会出现不规则的环状的提亮或增暗的效果。实际上是每个fj都有影响&#xff0c;但…

限量背包问题

问题描述 限量背包问题&#xff1a;从m个物品中挑选出最多v个物品放入容量为n的背包。 问题分析 限量背包问题&#xff0c;可以用来解决许多问题&#xff0c;例如要求从n个物品中挑选出最多v个物品放入容量为m的背包使得背包最后的价值最大&#xff0c;或者总共有多少种放法…

【数据结构】栈的实现以及数组和链表的优缺点

个人主页&#xff1a;一代… 个人专栏&#xff1a;数据结构 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进…

ETL工具kettle(PDI)入门教程,Job

先新建两个Transform&#xff0c;MysqlToMysql.ktr和CsvToExcel.ktrURL&#xff1a;ETL工具kettle入门教程&#xff0c;transform&#xff0c;Mysql-&#xff1e;Mysql&#xff0c;Csv-&#xff1e;Excel-CSDN博客 主对象树&#xff0c;作业上右击&#xff0c;点击新建 核心对…

面试题库-项目

1.项目主要实现了哪些功能&#xff1f; 本项目是专门为校园食堂窗口定制的一款软件产品&#xff0c;包括系统管理后台和客户端两部分。其中系统管理后台主要提供给食堂内部员工使用&#xff0c;可以对餐厅的菜品、套餐、订单、员工等进行管理维护。客户端主要提供给学生及校职…