当前位置: 首页 > news >正文

网络编程-套接字相关基础知识


1.1. Socket简介

套接字(socket)是一种通信机制,凭借这种机制, 客户端<->服务器 模型的通信方式既可以在本地设备上进行,也可以跨网络进行。

Socket英文原意是“孔”或者“插座”的意思,在网络编程中,通常将其称之为“套接字”,当前网络中的主流程序设计都是使用Socket进行编程的,因为它简单易用,它还是一个标准(BSD Socket),能在不同平台很方便移植,比如你的一个应用程序是基于Socket编程的,那么它可以移植到任何实现BSD Socket标准的平台,比如LwIP,它兼容BSD Socket;又比如Windows,它也实现了一套基于Socket的套接字接口,更甚至在国产操作系统中,如RT-Thread,它也实现了BSD Socket标准的Socket接口。

在Socket中,它使用一个套接字来记录网络的一个连接,套接字是一个整数,就像我们操作文件一样,利用一个文件描述符,可以对它打开、读、写、关闭等操作,类似的,在网络中,我们也可以对Socket套接字进行这样子的操作,比如开启一个网络的连接、读取连接主机发送来的数据、向连接的主机发送数据、终止连接等操作。

Linux系统中的套接字相关的函数,注意要包含网络编程中常用的头文件:

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

1.2. socket()

函数原型:

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

socket()函数用于创建一个socket描述符(socket descriptor),它唯一标识一个socket,这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。

创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为:
1. domain:参数domain表示该套接字使用的协议族
在Linux系统中支持多种协议族,对于TCP/IP协议来说,选择AF_INET就足以,当然如果你的IP协议的版本支持IPv6,那么可以选择AF_INET6,可选的协议族具体见:

AF_UNIX, AF_LOCAL: 本地通信
AF_INET : IPv4
AF_INET6 : IPv6

AF_IPX : IPX - Novell 协议
AF_NETLINK : 内核用户界面设备
AF_X25 : ITU-T X.25 / ISO-8208 协议
AF_AX25 : 业余无线电 AX.25 协议
AF_ATMPVC : 访问原始ATM PVC
AF_APPLETALK : AppleTalk
AF_PACKET : 底层数据包接口
AF_ALG : 内核加密API的AF_ALG接口

2. type:参数type指定了套接字使用的服务类型
可能的类型有以下几种:

SOCK_STREAM:提供可靠的(即能保证数据正确传送到对方)面向连接的Socket服务,多用于资料(如文件)传输,如TCP协议
SOCK_DGRAM:是提供无保障的面向消息的Socket 服务,主要用于在网络上发广播信息,如UDP协议,提供无连接不可靠的数据报交付服务。

SOCK_SEQPACKET:为固定最大长度的数据报提供有序的,可靠的,基于双向连接的数据传输路径。
SOCK_RAW:表示原始套接字,它允许应用程序访问网络层的原始数据包,这个套接字用得比较少,暂时不用理会它。
SOCK_RDM:提供不保证排序的可靠数据报层。

3. protocol:参数protocol指定了套接字使用的协议
在IPv4中,只有TCP协议提供SOCK_STREAM这种可靠的服务,只有UDP协议提供SOCK_DGRAM 服务,对于这两种协议,protocol的值均为0,因为当protocol为0时,会自动选择type类型对应的默认协议。

当创建套接字成功的时候,该函数返回一个int类型的值,也就是socket描述符,该值大于等于0;而如果创建套接字失败时则返回-1

1.3. bind()

函数原型:

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

在套接口中,一个套接字只是用户程序与内核交互信息的枢纽,它自身没有太多的信息,也没有网络协议地址和端口号等信息,在进行网络通信的时候,必须把一个套接字与一个IP地址或端口号相关联,这个过程就是绑定的过程。

bind()函数用于将一个 IP 地址或端口号与一个套接字进行绑定,许多时候内核会帮我们自动绑定一个IP地址与端口号,然而有时用户可能需要自己来完成这个绑定的过程,以满足实际应用的需要,最典型的情况是一个服务器进程需要绑定一个众所周知的地址和端口以等待客户来连接,作为服务器端,这一步绑定的操作是必要的,而作为客户端,则不是必要的,因为内核会帮我们自动选择合适的IP地址与端口号。

    ps:bind()函数并不是总是需要调用的,只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择。

参数:

    sockfd:sockfd是由socket()函数返回的套接字描述符。my_addr:my_addr是一个指向套接字地址结构的指针。addrlen:addrlen指定了以addr所指向的地址结构体的字节长度。

若bind()函数绑定成功则返回0,若出错则为-1。

sockaddr 结构内容如下:

sockaddr结构:

struct sockaddr {sa_family_t     sa_family;char            sa_data[14];
}

咋一看这个结构体,好像没啥信息要我们填写的,确实也是这样子,我们需要填写的IP地址与端口号等信息,都在sa_data连续的14字节信息里面,但这个结构对用户操作不友好,一般我们在使用的时候都会使用sockaddr_in结构,sockaddr_in和sockaddr是并列的结构(占用的空间是一样的),指向sockaddr_in的结构体的指针也可以指向sockadd的结构体,并代替它,而且sockaddr_in结构对用户将更加友好,在使用的时候进行类型转换就可以了。

sockaddr_in结构:

struct sockaddr_in {short int sin_family;               /* 协议族 */unsigned short int sin_port;        /* 端口号 */struct in_addr sin_addr;            /* IP地址 */unsigned char sin_zero[8];          /* sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节 */
};

这个结构体的第一个字段是与sockaddr结构体是一致的,而剩下的字段就是sa_data连续的14字节信息里面的内容,只不过从新定义了成员变量而已,sin_port字段是我们需要填写的端口号信息,sin_addr字段是我们需要填写的IP地址信息,剩下sin_zero 区域的8字节保留未用。

举个简单的使用实例:

struct sockaddr_in server;bzero(&server, sizeof(server));// assign IP, PORT
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(6666);// binding newly created socket to given IP and verification
bind(sockfd, (struct sockaddr*)&server, sizeof(server));

参考资料:

1.【野火】《i.MX Linux开发实战指南》

相关文章:

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…...

基于Python的医疗机构药品及耗材进销存信息管理系统

技术&#xff1a;pythonmysqlvue 一、系统背景 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本医疗机构药品及耗材信息管理系统就是在这样的大环境下诞生&#x…...

Java学习笔记(14)

常用API Java已经写好的各种功能的java类 Math Final修饰&#xff0c;不能被继承 因为是静态static的&#xff0c;所以使用方法不用创建对象&#xff0c;使用里面的方法直接 math.方法名 就行 常用方法 Abs,ceil,floor,round,max,minm,pow,sqrt,cbrt,random Abs要注意参数的…...

联合和枚举

联合体 联合体和结构体类似&#xff0c;也有多个成员构成&#xff0c;但编译器只为最大的成员分配足够的空间。 联合体最大的特点是所有的成员共用同一块内存空间。也叫共用体。 union Un { int i; struct s { char c1; char c2; char c…...

《深入Linux内核架构》第2章 进程管理和调度 (3)

目录 2.5 调度器的实现 2.5.1 概观 2.5.2 数据结构 2.5.3 处理优先级 2.5.3.1 nice和prior 2.5.3.2 vruntime 2.5.3.3 weight权重 2.5.4 核心调度器 2.5 调度器的实现 调度器的任务&#xff1a; 1. 执行调度策略。 2. 执行上下文切换。 无论用户态抢占&#xff0c;还是…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Refresh)

可以进行页面下拉操作并显示刷新动效的容器组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 从API version 11开始&#xff0c;Refresh子组件会跟随手势下拉而下移…...

数据资产管理解决方案:构建高效、安全的数据生态体系

在数字化时代&#xff0c;数据已成为企业最重要的资产之一。然而&#xff0c;如何有效管理和利用这些数据资产&#xff0c;却是许多企业面临的难题。本文将详细介绍数据资产管理解决方案&#xff0c;帮助企业构建高效、安全的数据生态体系。 一、引言 在信息化浪潮的推动下&a…...

Visual Studio 2013 - 调试模式下查看监视窗口

Visual Studio 2013 - 调试模式下查看监视窗口 1. 监视窗口References 1. 监视窗口 Ctrl Alt W&#xff0c;1-4&#xff1a;监视窗口 (数字键不能使用小键盘) or 调试 -> 窗口 -> 监视 -> 监视 1-4 调试状态下使用&#xff1a; 在窗口中点击空白行&#xff0c;…...

CTF 题型 SSRF攻击例题总结

CTF 题型 SSRF攻击&例题总结 文章目录 CTF 题型 SSRF攻击&例题总结Server-side Request Forgery 服务端请求伪造SSRF的利用面1 任意文件读取 前提是知道要读取的文件名2 探测内网资源3 使用gopher协议扩展攻击面Gopher协议 &#xff08;注意是70端口&#xff09;python…...

【Swing】Java Swing实现省市区选择编辑器

【Swing】Java Swing实现省市区选择编辑器 1.需求描述2.需求实现3.效果展示 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在公司的一个 Swing 的项目上需要实现一个选择省市区的编辑器&#xff0c;这还是第一次做这种编辑器&#xf…...

spring suite搭建springboot操作

一、前言 有时候久了没开新项目了&#xff0c;重新开发一个新项目&#xff0c;搭建springboot的过程都有点淡忘了&#xff0c;所有温故知新。 二、搭建步骤 从0开始搭建springboot 1&#xff0e;创建work空间。步骤FileNewJava Working Set。 2.选择Java Working Set。 3.自…...

mysql重构

力扣题目链接 列转行 SELECT product_id, store1 store, store1 price FROM products WHERE store1 IS NOT NULL UNION SELECT product_id, store2 store, store2 price FROM products WHERE store2 IS NOT NULL UNION SELECT product_id, store3 store, store3 price FROM p…...

Linux用户、用户组

用户管理命令&#xff1a; 首先要先知道两个配置文件&#xff1a;/etc/group 用户组配置文件/etc/passwd 保存了所有用户的用于读取的必要信息**/etc/shadow **是 Linux 系统中用于存储用户密码信息的文件。这个文件也被称为“影子文件”&#xff0c;因为它包含了 /etc/passwd…...

操作系统系列学习——信号量的代码实现

文章目录 前言信号量的代码实现 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈…...

【Python操作基础】——变量操作

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…...

滑模控制算法(SMC)讲解-案例(附C代码)

目录 一、滑模控制算法的基本原理 1)滑模面(Sliding Surface)的设计 2)达到条件(Reaching Condition)...

Redis数据结构对象之集合对象和有序集合对象

集合对象 集合对象的编码可以是intset或者hashtable. 概述 intset编码的集合对象使用整数集合作为底层实现&#xff0c;集合对象包含的所有元素都被保存在整数集合里面。 另一方面&#xff0c;hashtable编码的集合对象使用字典作为底层实现&#xff0c;字典的每个键都是一个…...

不要百花齐放

javascript中数组的遍历有如下方法&#xff1a; 1、for (var i 0; i < arr.length; i) 2、for(var item of arr) 3、for(var item in arr) 4、arr.forEach 5、arr.map 6、arr.filter 7、arr.find 8、arr.findIndex 9、arr.indexOf arr.lastIndexOf 10、arr.every…...

使用Java JDBC连接数据库

在Java应用程序中&#xff0c;与数据库交互是一个常见的任务。Java数据库连接&#xff08;JDBC&#xff09;是一种用于在Java应用程序和数据库之间建立连接并执行SQL查询的标准API。通过JDBC&#xff0c;您可以轻松地执行各种数据库操作&#xff0c;如插入、更新、删除和查询数…...

阿里云2核4G4M轻量应用服务器价格165元一年

阿里云优惠活动&#xff0c;2核4G4M轻量应用服务器价格165元一年&#xff0c;4Mbps带宽下载速度峰值可达512KB/秒&#xff0c;系统盘是60GB高效云盘&#xff0c;不限制月流量&#xff0c;2核2G3M带宽轻量服务器一年87元12个月&#xff0c;在阿里云CLUB中心查看 aliyun.club 当前…...

从原生UI到插件化框架:RAGENativeUI在GTA模组开发中的架构重构

从原生UI到插件化框架&#xff1a;RAGENativeUI在GTA模组开发中的架构重构 【免费下载链接】RAGENativeUI 项目地址: https://gitcode.com/gh_mirrors/ra/RAGENativeUI 在Grand Theft Auto V模组开发领域&#xff0c;界面系统长期面临着原生集成度低、性能开销大、开发…...

告别资源获取繁琐,实现高效资源管理与效率提升

告别资源获取繁琐&#xff0c;实现高效资源管理与效率提升 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader res-downloader是一…...

完整指南:如何高效使用SecHex-Spoofy进行Windows系统伪装与安全测试

完整指南&#xff1a;如何高效使用SecHex-Spoofy进行Windows系统伪装与安全测试 【免费下载链接】SecHex-Spoofy C# HWID Changer &#x1f511;︎ Disk, Guid, Mac, Gpu, Pc-Name, Win-ID, EFI, SMBIOS Spoofing [Usermode] 项目地址: https://gitcode.com/gh_mirrors/se/Se…...

你的杜邦线和PCB走线,可能正在‘谋杀’J-Link SWD的高速信号

你的杜邦线和PCB走线&#xff0c;可能正在‘谋杀’J-Link SWD的高速信号 在嵌入式开发中&#xff0c;我们常常会遇到一个令人头疼的问题&#xff1a;昨天还能正常工作的调试接口&#xff0c;今天突然就无法识别芯片了。更令人困惑的是&#xff0c;降低SWD时钟速率后&#xff0…...

保姆级教程:用LangFlow可视化工具3步搭建智能问答机器人,无需代码

保姆级教程&#xff1a;用LangFlow可视化工具3步搭建智能问答机器人&#xff0c;无需代码 1. 为什么选择LangFlow&#xff1f; 想象一下&#xff0c;你有一个绝妙的AI应用创意&#xff0c;但面对复杂的代码和API文档却无从下手。LangFlow就是为解决这个问题而生的可视化工具&…...

零基础玩转Qwen3-VL-8B:上传图片提问,本地AI助手秒答

零基础玩转Qwen3-VL-8B&#xff1a;上传图片提问&#xff0c;本地AI助手秒答 1. 项目简介 Qwen3-VL-8B是一款基于阿里云通义实验室最新多模态模型开发的本地交互工具。它最大的特点就是能让你的电脑变成一个"会看图的智能助手"——你上传一张照片&#xff0c;然后像…...

保姆级教程:用ACE-Step一键生成多语言音乐,视频配乐不求人

保姆级教程&#xff1a;用ACE-Step一键生成多语言音乐&#xff0c;视频配乐不求人 你是不是也遇到过这样的烦恼&#xff1f;精心剪辑的视频&#xff0c;万事俱备&#xff0c;就差一段能完美烘托氛围的背景音乐。翻遍免费音乐库&#xff0c;要么风格不搭&#xff0c;要么听腻了…...

Qwen3-ASR-0.6B模型监控:Prometheus指标采集

Qwen3-ASR-0.6B模型监控&#xff1a;Prometheus指标采集 1. 引言 当你把Qwen3-ASR-0.6B语音识别模型部署到生产环境后&#xff0c;最让人头疼的问题就是&#xff1a;我怎么知道它现在运行得好不好&#xff1f;GPU使用率是不是正常&#xff1f;推理延迟有没有超标&#xff1f;…...

揭秘seL4微内核:如何通过创新资源管理实现高效公平的任务调度?

揭秘seL4微内核&#xff1a;如何通过创新资源管理实现高效公平的任务调度&#xff1f; 【免费下载链接】seL4 The seL4 microkernel 项目地址: https://gitcode.com/gh_mirrors/se/seL4 seL4微内核作为一款经过形式化验证的实时操作系统内核&#xff0c;其资源管理机制是…...

Qwen3-TTS在VSCode中的开发调试技巧:从语音克隆到音色设计

Qwen3-TTS在VSCode中的开发调试技巧&#xff1a;从语音克隆到音色设计 1. 开发环境搭建 1.1 Python虚拟环境配置 在VSCode中开发Qwen3-TTS项目&#xff0c;首先需要配置合适的Python环境。推荐使用conda或venv创建独立的虚拟环境&#xff0c;避免依赖冲突。 # 使用conda创建…...