Linux socket网络编程概述 和 相关API讲解

socket网络编程的步骤

大体上,连接的建立过程就是:服务器在确定协议类型后,向外广播IP地址和端口号,并监听等待,直到客户端获取了IP地址和端口号并成功连接:

 使用socket来进行tcp协议的网络编程的大体步骤:

其实socket的使用就像之前文件编程中打开文件的操作一样,返回的是一个标识符,之后就对这个标识符进行操作。

相关的API讲解

参考:linux网络编程:网络socket基础编程(一) 基础API_Jags的博客-CSDN博客

socket函数

创建套接字的函数

头文件

#include <sys/types.h>     
#include <sys/socket.h>

函数原型

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

函数参数

  • domian:表示所使用的协议族,可以选取以下值中的一个:

AF_INET:IPv4因特网域 (最常用,TCP/IP的协议族)

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”,表示type类型对应的默认协议,也可以从以下值中选一个:

IPPROTO_TCP:tcp协议

IPPROTO_UDP:udp协议

IPPROTO_SCTP:sctp协议

IPPROTO_TIPC:tipc协议

... ...

  • 返回值:成功则返回 监听套接字描述符,失败返回-1

 

bind函数(服务器)

服务器绑定IP和端口号到网络标识符的函数

头文件

#include <sys/types.h>    
#include <sys/socket.h>

函数原型

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

函数参数

  • sockfd:socket函数返回的 监听套接字描述符
  • addr:一个结构体指针,指向 “包含有本机IP地址以及端口号” 的 “sockaddr结构体” 的指针
//ipv4(AF_INET)对应的地址结构
struct sockaddr{unsigned 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]; //填充,没有实际意义,只是为了跟socketaddr结构在内存中对齐,这样两者才能相互转换
};
  • addrlen:第二个参数所指向的结构体的长度,使用 sizeof()来获取
  • 返回值:成功返回0,失败返回-1

listen函数(服务器)

服务器监听设置的函数

在这里插入图片描述

头文件

#include <sys/types.h>      
#include <sys/socket.h>

函数原型

int listen(int sockfd, int backlog);

函数参数

  • sockfd:socket函数返回的 监听套接字描述符
  • backlog:指定在请求队列中允许的最大请求数
  • 返回值:成功则返回0,失败返回-1

accept函数(服务器)

服务器接受连接的函数,用于从已完成连接队列的队头返回下一个已完成连接,如果已完成连接队列为空,那么进程投入睡眠

在这里插入图片描述

头文件

#include <sys/types.h>      
#include <sys/socket.h>

函数原型

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

函数参数

  • sockfd:socket函数返回的 监听套接字描述符
  • addr:用来返回已连接的客户端的协议地址,不关心就写NULL
  • addrlen:返回上一个参数对应结构体的长度,不关心就写NULL
  • 返回值:成功则返回已 连接套接字描述符,失败返回-1

connect函数(客户端)

客户端连接的函数,如果是TCP套接字,调用 connect函数将激发TCP的三路握手过程

头文件

#include <sys/types.h>      
#include <sys/socket.h>

函数原型

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

函数参数

  • sockfd:套接字描述符
  • addr:服务器端的协议地址
  • addrlen:返回上一个参数对应结构体的长度
  • 返回值:成功返回0,失败返回-1

inet_aton 和 inet_ntoa函数

地址转换的API

头文件

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

函数原型

int inet_aton(const char *cp, struct in_addr *inp);
//把字符串形式的“192.168.X.XXX”转为网络能识别的格式
char *inet_ntoa(struct in_addr in);
//把网络格式的IP地址转为字符串形式

函数参数1

  • cp:字符串形式的IP地址
  • inp:存放转化后的 网络形式的IP地址
  • 返回值:成功返回1,失败返回0

函数参数2

  • in:网络形式的IP地址
  • 返回值:成功返回点分十进制数,失败返回NULL

read 和 write 函数

在套接字通讯中进行字节读取函数

和之前文件的的读写函数名字一样,但参数不太一样,因为在套接字的通讯中,输入或输出的字节可能比请求的少。

使用详见:使用read write 读写socket_san.hang的博客-CSDN博客

头文件

#include <unistd.h>

函数原型

ssize_t write(int fd, const void *buf, size_t nbytes);
//将buf中的nbytes个字节写入到文件描述符fd,成功时返回写的字节数
ssize_t read(int fd, void *buf, size_t nbyte);
//从fd读取nbyte个字节到buf中,返回实际所读的字节数

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

send 和 recv函数

另一组用于socket数据收发的API

头文件

#include <sys/types.h>      
#include <sys/socket.h>

函数原型

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

函数参数

  • sockfd:socket函数返回的 监听套接字描述符
  • buf:代发数据 / 接受缓冲区
  • len:数据长度
  • flags:通常为0
  • 返回值:成功返回 发送 / 接收 的字节数, 失败 返回-1

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

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

相关文章

创邻科技张晨:图数据库,激活数据要素的新基建

“数据经济时代&#xff0c;数据要素产业链的各细分领域均蕴含机遇&#xff0c;图技术作为网络协同和数据智能的底层发动机&#xff0c;将深度掘金数字中国价值潜能”。 8月22日&#xff0c;在2023中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会的信息技术…

操作系统期末考试复习——简答题总结

最近考研在复习OS&#xff0c;顺便把大二期末考试的简答题整理了一下~ 1、操作系统的定义 “操作系统&#xff08;operating system&#xff0c;简称OS&#xff09;是管理计算机硬件与软件资源的计算机程序 2、操作系统的基本类型及特征 批处理操作系统、分时操作系统、实时…

400电话系统如何进行数据分析和优化?

400电话系统可以通过以下方式进行数据分析和优化&#xff1a; 呼叫记录&#xff1a;400电话系统会记录每一次呼叫的相关信息&#xff0c;包括呼叫时间、呼叫持续时间、呼叫地点等。通过分析呼叫记录&#xff0c;企业可以了解客户的呼叫习惯和行为模式&#xff0c;如高峰时段、呼…

新唐Nuc980学习笔记1 - 工程创建和下载

一、新唐nuc980 新唐nuc980 iot开发板是Linux 工业物联网开发平台&#xff0c;新唐科技提供工业物联网开发平台采用 NUC980DK 微处理器&#xff0c;此为一套完整的工业用物联网开平台&#xff0c;包含了完整的硬件设计与软件参考设计。包含了新唐执行速度 300 MHz 的 ARM9 MPU …

idea的debug断点的使用

添加断点&#xff08;目前不知道如何添加断点&#xff0c;就给AutoConfigurationImportSelector的每个方法都加上断点&#xff09;&#xff1a; 然后将StockApplication启动类以debug方式运行&#xff0c;然后程序就会停在119行 点击上边的step over让程序往下运行一行&#x…

有效降低传导辐射干扰

一直以来&#xff0c;设计中的电磁干扰&#xff08;EMI&#xff09;问题十分令人头疼&#xff0c;尤其是在汽车领域。为了尽可能的减小电磁干扰&#xff0c;设计人员通常会在设计原理图和绘制布局时&#xff0c;通过降低高di / dt的环路面积以及开关转换速率来减小噪声源。 但…

Mybatis动态之灵活使用下

目录 ​编辑 前言&#xff1a; 1.mybatis的分页 1.1分页的应用场景 1.2分页的使用方式 2.mybatis中特殊字符处理 2.1mybatis中特殊字符介绍 2.2mybatis中特殊字符的使用方式 前言&#xff1a; 上篇我已经写了Mybatis动态之灵活使用&#xff0c;接着上篇写mybatis的分页…

Django基础3——视图函数

文章目录 一、基本了解1.1 Django内置函数1.2 http请求流程 二、HttpRequest对象&#xff08;接受客户端请求&#xff09;2.1 常用属性2.2 常用方法2.3 服务端接收URL参数2.4 QueryDict对象2.5 案例2.5.1 表单GET提交2.5.2 表单POST提交2.5.3 上传文件 三、HttpResponse对象&am…

Source Insight配置Cppcheck做静态测试(Windows)

1.安装cppcheck 先从cppcheck官方网站下载cppcheck的安装包。 注&#xff1a; &#xff08;1&#xff09;官网地址&#xff1a;https://sourceforge.net/projects/cppcheck &#xff08;2&#xff09;截止2023年8月&#xff0c;官方发布的最新版本是cppcheck-2.11-x64-Setup.…

rabbitmq卸载重新安装3.8版本

卸载之前的版本的rabbitmq 卸载rabbitmq 卸载前先停止rabbitmq服务 /usr/lib/rabbitmq/bin/rabbitmqctl stop查看rabbitmq安装的相关列表 yum list | grep rabbitmq卸载rabbitmq相关内容 yum -y remove rabbitmq-server.noarch 卸载erlang 查看erlang安装的相关列表 …

漏洞扫描和漏洞评估

进行漏洞扫描和漏洞评估是确保系统和应用程序安全性的重要步骤。 下面是一个详细的步骤指南&#xff0c;说明如何进行漏洞扫描和漏洞评估。 步骤&#xff1a; 信息收集&#xff1a; 在开始漏洞扫描之前&#xff0c;收集有关目标系统和应用程序的信息&#xff0c;包括IP地址、…

OnePlus Open可折叠手机:规格、价格、发布日期等详细信息汇总!

我们知道OnePlus可折叠手机即将问世,无论它是否被命名为OnePlus Open。我们迫不及待地想让它到来,为该公司再添一根弦,为最好的可折叠手机增添一个新的竞争对手。 OnePlus以前没有生产过任何可折叠产品,但它确实拥有合作伙伴公司Oppo的丰富知识,并可以向三星、摩托罗拉和…

前端工程化之模块化

模块化的背景 前端模块化是一种标准&#xff0c;不是实现理解模块化是理解前端工程化的前提前端模块化是前端项目规模化的必然结果 什么是前端模块化? 前端模块化就是将复杂程序根据规范拆分成若干模块&#xff0c;一个模块包括输入和输出。而且模块的内部实现是私有的&…

利用LLM模型微调的短课程;钉钉宣布开放智能化底座能力

&#x1f989; AI新闻 &#x1f680; 钉钉宣布开放智能化底座能力AI PaaS&#xff0c;推动企业数智化转型发展 摘要&#xff1a;钉钉在生态大会上宣布开放智能化底座能力AI PaaS&#xff0c;与生态伙伴探寻企业服务的新发展道路。AI PaaS结合5G、云计算和人工智能技术的普及和…

Android相机-HAL-Rockchip-hal3

引言&#xff1a; 对于Android相机的 HAL层而言对上实现一套Framework的API接口&#xff0c;对下通过V4L2框架实现与kernel的交互。不同的平台会有不同的实现方案。主要是对Android HAL3的接口的实现。看看rockchip是怎么支持hal3的&#xff1f; 代码目录&#xff1a; hardw…

destoon8.0自媒体类型综合资讯门户模板

随着时代发展&#xff0c;自媒体资讯适合当前的互联网情形。呕心沥血开发的一套自媒体综合门户网站模板&#xff0c;本模板采用纯手写开发&#xff0c;带会员中心。首页&#xff0c;列表页&#xff0c;内容页&#xff0c;搜索页面精心编写&#xff0c;非常大气&#xff0c;并配…

Stable Diffusion 文生图技术原理

图像生成模型简介 图片生成领域来说&#xff0c;有四大主流生成模型&#xff1a;生成对抗模型&#xff08;GAN&#xff09;、变分自动编码器&#xff08;VAE&#xff09;、流模型&#xff08;Flow based Model&#xff09;、扩散模型&#xff08;Diffusion Model&#xff09;。…

Android JNI系列详解之CMake配置库文件的输出目录

一、前提 阅读上一篇文章Android JNI系列详解之CMake编译工具的使用&#xff0c;里面讲到了需要配置两个文件&#xff1a;CMakeList.txt和build.gradle 二、配置CMake编译工具输出库文件的路径 1.默认的库文件输出路径&#xff1a;app/build/intermediates/cmake/debug/obj 由此…

element-ui中的el-table的summary-method(合计)的使用

场景图片&#xff1a; 图片1&#xff1a; 图片2&#xff1a; 一&#xff1a;使用element中的方法 优点&#xff1a; 直接使用summary-method方法&#xff0c;直接&#xff0c;方便 缺点&#xff1a; 只是在表格下面添加了一行&#xff0c;如果想有多行就不行了 1&#xff1a;h…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【一】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【一】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章…