Linux--socket编程

socket套接字编程

一、服务器和客户端的开发步骤:
在这里插入图片描述

1、创建套接字
2、为套接字添加信息(ip地址和端口号)
3、监听网络连接
4、监听到有客户端接入,接受连接(如没有接入,会发生阻塞到)
5、数据交互(服务器与客户端)
6、关闭套接字,断开连接

二、socket函数api
1、创建套接字:

int socket(int domain, int type, int protocol);/*
domain:
指明所使用的协议族,通常为AF_INET,表示互联网协议族(tcp/ip协议族);
AF_INET        IPv4因特网域(192.168.---.---)
AF_INET6       IPv6因特网域
AF_UNIX        Unix域
AF_ROUTE       路由套接字
AF_KEY         密钥套接字
AF_UNSPEC      未指定type参数指定socket的类型:SOCK_STREAM:流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。SOCK_DGRAM(报文):数据报套接字定义了一种无连接的服务器,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠的、无差错的。它使用数据协议UDP。SOCK_RAW:允许程序使用低层协议,原始套接字允许对底层协议如IP或ICMP进行访问,功能强大但较为不便,主要用于一些协议的开发。protocol:
通常赋值"0"。0选择type类型对应的默认协议IPPROTO_TCP         TCP传输协议IPPROTO_UDP         UDP传输协议IPPROTO_SCTP        SCTP传输协议IPPROTO_TIPC        TIPC传输协议
*/

2、地址
添加地址(IP地址+端口号),调用 bind() 函数
bind() 函数 :IP端口号与相应描述字赋值函数
功能:用于绑定ip地址和端口号到socketfd
参数:

sockfd:时socket的描述符
addr:是一个指向含有本机ip地址及端口号等信息的sockaddr类型的指针,指向要绑定给sockfd的协议地址结构,这个地址结构根据地址创建socket时的地址协议族的不同而不同。
addrlen:长度

#include <sys/types.h>
#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//描述符,指针,指针长度//ipv4对应的是;
struct sockaddr{unisgned short as_family;//协议族char           sa_data[14];//IP+端口号
};
//同等替换
struct sockaddr_in{sa_family_t    sin_family;//协议族in_port_t      sin_port;  //端口号struct in_addr sin_addr;  //ip地址结构体unsigned char  sin_zero[8];//填充,没有实际意义,只是为跟sockaddr结构在内存中对齐,这样才能相互转换
};

3、地址转换api

int inet_aton(const char* straddr, struct in_addr addrp);
把字符串形式"192.168.1.123"转为网络能识别的格式
char
inet_ntoa(struct in_addr inaddr);
把网络格式的ip地址转为字符串形式

4、监听
调用 listen() 函数:监听设置函数
功能:
设置能处理的最大连接数, listen()并未开始接受连线,只是设置socket 的 listen 模式,listen()函数只用于服务器端,服务器进程不知道与谁连接,因此不会主动要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并做出处理:一个服务进程可以同时处理多个客户进程的连接。
主要有2个功能:
①将一个未连接的套接字转换为一个被动套接字(监听)
②规定内核为相应套接字排队的最大连接数。

内核为任何一个给定监听套接字维护两个队列:

①未完成连接队列,每个这样的SYN报文段对应其中一项:已由某个客户端发出并到达服务器,而服务器正在等待完成相应的TCP三次握手过程。这些套接字处于SYN_REVD状态。
②已完成连接队列,每个已完成TCP三次握手过程的客户端对应其中一项。这些套接字处于ESTABLISHED状态。

参数:

sockfd:是socket系统调用返回服务器端的socket描述符
backlog:指定在请求队列中允许的最大请求数


#include <sys/types.h>
#include <sys/socket.h>int listen(int sockfd, int backlog);
//描述符,数量

5、连接
调用accept() 函数:
功能:
accept函数由TCP服务器调用,用于从已完成连接队列头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。
参数:

sockfd:是socket系统调用返回的服务器端socket描述符。
addr:用来返回已连接的对端(客户端)的协议地址
addrlen:客户端地址长度

返回值:
该函数的返回值是一个新的套接字描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字(表示TCP三次握手已完成),当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。


#include <sys/types.h>
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//描述符,客户端地址,地址长度

6、数据收发
在套接字通信中进行字节读取函数:read(),write()。与I/O中的读取函数略有区别,他们输入和输出字节数比可能比请求的少。

ssize_t write(int fd, const void *buf,size_t nbytes);
ssize_t read(int fd, void *buf, size_t nbyte);
//函数均返回读或写的字节个数,出错则返回-1

第一个将buf中的nbyte个字节写入fd中,成功返回写入的字节个数
第二个从fd中读取nbyte个字节到buf中,返回实际读取的字节数。

网络I/O还有一些函数,例如:recv() / send(),readv() / writev(),recvmsg() / sendmsg(), recvfrom() / sendto()等

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

flink处理函数--副输出功能

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

概率密度函数,概率分布函数

概率密度函数&#xff1a;描述信号的取值在某个确定的取值点附近的概率的函数&#xff1b;概率分布函数的导数。 以幅值大小为横坐标&#xff0c;以每个幅值间隔内出现的概率为纵坐标进行统计分析。反映了信号落在不同幅值强度区域内的概率情况。 直方图&#xff1a;对每个幅…

数据结构--队列与循环队列的实现

数据结构–队列的实现 1.队列的定义 比如有一个人叫做张三,这天他要去医院看病,看病时就需要先挂号,由于他来的比较晚,所以他的号码就比较大,来的比较早的号码就比较小,需要到就诊窗口从小号到大依次排队,前面的小号就诊结束之后,才会轮到大号来,小号每就诊完毕就销毁,每新来…

基于Java的火车高铁订票购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

支持向量机SVM:从数学原理到实际应用

目录 一、引言背景SVM算法的重要性 二、SVM基础线性分类器简介什么是支持向量&#xff1f;超平面和决策边界SVM的目标函数 三、数学背景和优化拉格朗日乘子法&#xff08;Lagrange Multipliers&#xff09;KKT条件核技巧&#xff08;Kernel Trick&#xff09;双重问题和主问题&…

【云备份】

文章目录 [toc] 1 :peach:云备份的认识:peach:1.1 :apple:功能了解:apple:1.2 :apple:实现目标:apple:1.3 :apple:服务端程序负责功能:apple:1.4 :apple:服务端功能模块划分:apple:1.5 :apple:客户端程序负责功能:apple:1.6 :apple:客户端功能模块划分:apple: 2 :peach:环境搭建…

留住时光、固化时间、让一瞬成为永恒——全新的真人手办定制模式,就选易模小程序制作。

如何能永远留住一瞬间&#xff1f; 有人说我可以拍摄一张照片&#xff0c;照片的问世确实给生活中许多美好的瞬间留下了可以记录的工具。但是随着时间的流逝&#xff0c;照片终究也会泛黄&#xff0c;似乎有一些记忆的温度&#xff0c;有一些岁月的棱角&#xff0c;也是照片所给…

SD卡格式化怎么恢复?

随着智能手机、平板电脑、数码相机和行车记录仪等各种移动电子设备走入千家万户&#xff0c;SD卡作为与这些设备相配套的存储介质&#xff0c;也随之获得了广泛的市场认可。SD卡因其体积小巧、容量庞大、读写速度高及与多种设备兼容的优点&#xff0c;逐渐成为日常工作和生活中…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 方法二&#xff1a;动态规划 方法三&#xff1a;回溯算法 方法四&#xff1a;并查集 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;排序和遍历 方法二&#xff1a;扫描线算法 方法…

StarRocks数据导入

1、相关环境 Flink作为当前流行的流式计算框架&#xff0c;在对接StarRocks时&#xff0c;若直接使用JDBC的方式"流式"写入数据&#xff0c;对StarRocks是不友好的&#xff0c;StarRocks作为一款MVCC的数据库&#xff0c;其导入的核心思想还是"攒微批降频率&qu…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

车牌文本检测与识别:License Plate Recognition Based On Multi-Angle View Model

论文作者&#xff1a;Dat Tran-Anh,Khanh Linh Tran,Hoai-Nam Vu 作者单位&#xff1a;Thuyloi University;Posts and Telecommunications Institute of Technology 论文链接&#xff1a;http://arxiv.org/abs/2309.12972v1 内容简介&#xff1a; 1&#xff09;方向&#x…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速&#xff0c;同时改变对应的背景色 仪表盘 开始是想着使用echarts&#xff0c;修修改改拿来用&#xff0c;但是人家客户有规定&#xff0c;必须搞个差不多的&#xff0c;那没办法&#xff0c;自 己动手搞个吧 截图如下&am…

多源最短路径的原理及C++实现

时间复杂度 O(n3),n是端点数。 核心代码 template<class T, T INF 1000 * 1000 * 1000> class CNeiBoMat { public: CNeiBoMat(int n, const vector<vector<int>>& edges,bool bDirectfalse,bool b1Base false) { m_vMat.assign(n, vector<…

2023年【R2移动式压力容器充装】模拟考试及R2移动式压力容器充装模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装模拟考试考前必练&#xff01;安全生产模拟考试一点通每个月更新R2移动式压力容器充装模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过R2移动式压力容器充装操作证考试很简单。 1…

MySQL5.7版本与8.0版本在Ubuntu(WSL环境)系统安装

目录 前提条件 1. MySQL5.7版本在Ubuntu&#xff08;WSL环境&#xff09;系统安装 1. 1 下载apt仓库文件 1.2 配置apt仓库 1.3 更新apt仓库的信息 1.4 检查是否成功配置MySQL5.7的仓库 5. 安装MySQL5.7 1.6 启动MySQL 1.7 对MySQL进行初始化 1.7.1 输入密码 …

PDF文件压缩软件 PDF Squeezer mac中文版​软件特点

PDF Squeezer mac是一款macOS平台上的PDF文件压缩软件&#xff0c;可以帮助用户快速地压缩PDF文件&#xff0c;从而减小文件大小&#xff0c;使其更容易共享、存储和传输。PDF Squeezer使用先进的压缩算法&#xff0c;可以在不影响文件质量的情况下减小文件大小。 PDF Squeezer…

排序算法之【快速排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…