Linux套接字编程

这篇具有很好参考价值的文章主要介绍了Linux套接字编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一篇博客中我们对网络中一些基本概念进行了简单阐述,这一篇博客我们来对套接字编程的内容进行初步了解。

目录

1.引入

2.UDP协议

2.1通信两端流程

2.1.1服务端流程

2.1.2客户端流程

2.2套接字相关操作接口

2.2.1创建套接字

2.2.2为套接字绑定地址信息

2.2.3发送数据

2.2.4接收数据

2.2.5关闭套接字

2.3字节序相关操作接口

2.3.1主机字节序到网络字节序转换

2.3.2网络字节序到主机字节序转换

2.3.3本地ip地址到网络ip地址转换

2.3.4网络ip地址到本地ip地址转换

2.4代码实现

1.引入

在上一篇博客中我们讲述了一些网络通信的基础内容,其中对于网络通信中所需要的:源端IP,对端IP,源端端口,对端端口和协议(五元组)进行了了解。我们明白:在网络通信中发起请求的成为客户端,另外被动接受请求的一方成为服务端。网络通信便是客户端与服务端之间的通信。

接下来我们锁讲述到的套接字编程单元,便是对网络通信程序的编写,其中有TCP协议网络程序的编程和UDP协议的网络程序编写。

TCP协议和UDP协议的基本内容和区别:

TCP是传输控制协议,一种面向连接,可靠传输,提供字节流传输的服务。其中面向连接是指:通信前先建立连接,确保双方都具有数据收发的能力;可靠传输是指:在网络情况正常下,保证数据可以安全有序的到达对端;字节流传输是指:传输单元以字节为单位,并不限制传输数据的大小,每次传输内容大小较为灵活。

UDP是用户数据报协议,一种无连接,不可靠,提供数据报传输的服务。其中无连接是指:只需要知道对方地址,便会直接发送数据,不需要建立连接;不可靠是指:不保证数据可以安全有序的到达对端,数据若丢失意味着无法寻找;数据报传输是指:传输交付以数据报为单元,不能传输半条数据或多条数据,并且存在最大长度限制。

总而言之,TCP协议适合传输安全性要求大于实时性要求的情况;UDP协议适合传输实时性要求大于安全性要求的情况。

2.UDP协议

2.1通信两端流程

2.1.1服务端流程

对于服务端而言,首先是创建套接字来建立当前进程和网卡之间的关联,实际上便是在内核中创建一个socket结构体;然后是为套接字绑定地址信息,为创建的socket结构体内部描述源端IP地址和端口,即告诉操作系统收到的数据中凡是对应绑定的地址和端口便交由此进程来处理;(其中所绑定的地址,必须是当前设备所拥有的地址)

其次是接收数据,即从内核中的socket结构体缓冲区中取出相关数据内容;再是发送数据,即将数据内容放到内核socket结构体中的发送缓冲区,并由系统决定具体的发送时间;最后当我们不需要进行通信时,便关闭套接字,释放资源。

2.1.2客户端流程

对于客户端而言,首先同样的是创建套接字,建立当前进程和网卡之间的关联;然后对客户端中套接字绑定地址信息并不重要,因为在实际通信当中客户端本身没有清楚自身地址的必要,它仅需要将需要发送的数据内容,放到创建的socket结构体的发送缓冲区之中,如果我们为其绑定固定地址反而会使得该客户端只能运行一个,还存在端口冲突的风险;

其次是发送数据,如果一开始为客户端绑定了地址信息,则源端地址便是绑定的地址,若未绑定,则操作系统会为其选择一个合适的地址和端口进行自动绑定;再是接收数据,即从对应的socket结构体中的接收缓冲区中读取内容;最后是通信结束,关闭套接字,释放资源。

2.2套接字相关操作接口

2.2.1创建套接字

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

socket接口便是创建套接字,其中domain是地址域类型(域间通信,ipv4通信,ipv6通信),不同的通信方式有不同的地址结构,关键字:AF_INET -- ipv4通信;

type是套接字类型,SOCK_STREAM:流式套接字,提供字节流传输服务,默认是TCP协议,SOCK_DGRAM:数据报套接字,提供数据报传输,默认协议是UDP协议。

protocol是协议类型,默认使用0,则表示使用套接字类型对应的默认协议,关键字:IPPROTO_TCP:值为6;IPPROTO_UDP:值为17。

返回值:创建成功则返回一个套接字描述符,失败则返回-1。

2.2.2为套接字绑定地址信息

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

bind接口便是为套接字绑定相关的地址信息,其中sockfd是socket接口创建套接字成功后,所返回的套接字描述符;

addr是要绑定的地址信息,不同的地址域信息,代表不同的地址结构。不过无论何种地址结构,其中的前2个字节都保证是地址域信息,因此当我们传入地址结构的空间信息时,只需要取出其中前2字节的数据,便可清楚是何种地址结构,并通过与之相应的解析方式来获取其中的数据内容。

因此定义的addr是一个通用的地址结构,当我们需要进行相应的通信时,只需要将类型进行强转传入即可,如此便可实现一个接口绑定不同的地址结构。(ipv4使用struct socketaddr_in结构)

len便是对应的数据长度。

返回值:绑定地址信息成功则返回0,失败返回-1。

2.2.3发送数据

ssize_t sendto(int sockfd, void *buf, size_t dlen, int flag, struct sockaddr* peer, socklen_t alen);

 sendto接口便是发送数据接口,其中sockfd是socket返回的套接字描述符;buf是发送数据空间的起始地址;dlen是要发送数据长度,从buf开始发送dlen长度的数据;flag是发送方式,默认为0,即阻塞发送(发送缓冲区存满则阻塞);peer是对端地址信息,描述数据的发送对象;alen是对端地址信息长度。

返回值:发送成功则返回发送数据的实际字节长度,发送失败返回-1。

2.2.4接收数据

ssize_t recvfrom(int sockfd, void *buf, size_t dlen, int flag, struct sockaddr* peer, socklen_t *alen);

recvfrom接口便是接收数据接口,其中sockfd是socket返回的套接字描述符;buf是一块空间的起始地址,接收到的数据便会放到其中;dlen是想要接口的数据长度;flag是接收方式,默认为0,即阻塞接受(接受缓冲区中不存在数据则阻塞);

peer用于接受数据同时,得知数据的发送方地址,便于通信,因此这里的peer是一个输出参数,用于返回对端地址信息;alen是地址信息的长度,是一个输入输出参数,表示想要接收的地址信息长度,以及实际返回得到的地址信息长度。

返回值:接收成功则返回接受数据的实际字节长度,接收失败返回-1。

2.2.5关闭套接字

int close(int sockfd);

close接口便是用于关闭套接字,释放资源,其中sockfd便是具体的套接字描述符。

返回值:关闭成功返回0,失败返回-1。

2.3字节序相关操作接口

2.3.1主机字节序到网络字节序转换

uint32_t htonl(uint32_t val);
uint16_t htons(uint16_t val);

htonl和htons接口分别是32位下和16位下主机字节序到网络字节序的转换。

2.3.2网络字节序到主机字节序转换

uint32_t ntohl(uint32_t val);
uint16_t ntohs(uint16_t val);

ntohl和ntohs接口分别是32位下和16位下网络字节序到主机字节序的转换。

2.3.3本地ip地址到网络ip地址转换

typedef uint32_t in_addr_t;
in_addr_t inet_addr(const char* ip);

inet_addr接口便是将本地的十进制字符串ip地址,转换为网络字节序的整数ip地址,包括类型转换和字节序转换。

2.3.4网络ip地址到本地ip地址转换

struct in_addr {
    in_addr_t s_addr;
}
const char* inet_ntoa(struct in_addr addr);

inet_ntoa便是将网络字节序整数ip地址,转换为一个点分十进制字符串ip地址。

值得注意的是,ipv4的地址结构如下:

struct sockaddr_in {
    sa_family_t sin_family;//2字节的地址域类型
    in_port_t sin_port;//2字节的端口内容
    struct in_addr sin_addr;//4字节的IP地址内容
    char sin_zero[sizeof(struct sockaddr) - 8];
}

2.4代码实现

我们首先对服务端的操作流程进行代码实现,得到结果如下:

Linux套接字编程

接下来我们为便于用户使用,也为了实现代码的泛用性,我们可以实现一个UdpSocket类来封装通信中的操作。

Linux套接字编程然后在客户端加以调用即可:

Linux套接字编程文章来源地址https://www.toymoban.com/news/detail-430833.html

到了这里,关于Linux套接字编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】网络编程套接字一

    上篇博客由唐僧的例子我们知道: 在IP数据包头部中,有两个IP地址,分别叫做源IP地址,和目的IP地址。 思考一下: 不考虑中间的一系列步骤,两台主机我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子,有了IP地址能够把消息发送到对方的机器上。 但是我们把

    2024年03月26日
    浏览(256)
  • 【Linux网络编程】网络编程套接字二

    喜欢的点赞,收藏,关注一下把! TCP和UDP在编程接口上是非常像的,前面我们说过TCP是面向连接的,UDP我们上篇博客也写过了,我们发现UDP服务端客户端写好启动直接就发消息了没有建立连接。TCP是建立连接的,注定在写的时候肯定有写不一样的地方。具体怎么不一样,我们

    2024年04月15日
    浏览(64)
  • Linux网络编程——tcp套接字

    本章Gitee仓库:tcp套接字 客户端: 客户端: 关于构造和初始化,可以直接在构造的时候,将服务器初始化,那为什么还要写到 init 初始化函数里面呢? 构造尽量简单一点,不要做一些“有风险”的操作。 tcp 是面向连接的,通信之前要建立连接,服务器处于等待连接到来的

    2024年02月20日
    浏览(58)
  • 【Linux】揭开套接字编程的神秘面纱(下)

    ​🌠 作者:@阿亮joy. 🎆 专栏: 《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 在揭开套接字编程神秘面纱(上)中,我们已经学习到了套接字编程的相关基础知识以及编写了基于 UDP 协议的

    2023年04月12日
    浏览(72)
  • 【Linux】揭开套接字编程的神秘面纱(上)

    ​🌠 作者:@阿亮joy. 🎆 专栏: 《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 源IP地址和目的IP地址 源 IP 地址指发送方的 IP 地址,而目的 IP 地址是指接收方的 IP 地址,源 IP 地址和目的

    2023年04月09日
    浏览(103)
  • 【Linux网络】网络编程套接字(TCP)

    目录 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 关于inet_ntoa 简单的单执行流TCP网络程序 TCP socket API 详解及封装TCP socket  服务端创建套接字  服务端绑定  服务端监听  服务端获取连接  服务端处理请求 客户端创建套接字 客户端连接服务器 客户端发起请求 服务器测试

    2024年03月21日
    浏览(71)
  • linux【网络编程】之网络套接字预备

    在【网络基础】中我们提到了IP地址,接下来了解一下网络通信中其他方面的知识 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; 一个端口号只能被一个进程占用 通信原理 (公网)IP唯一标识一台主机,这样两台

    2024年02月05日
    浏览(91)
  • 【Linux】网络基础+UDP网络套接字编程

    只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事。 1. 首先计算机是人类设计出来提高生产力的工具,而人类的文明绵延至今一定离不开人类之间互相的协作,既然人类需要协作以完成更为复杂的工作和难题,所以计算机作为人类的工具自然也一定需要

    2024年02月08日
    浏览(63)
  • Linux网络编程- 原始套接字(Raw Socket)

    原始套接字(Raw Socket)提供了一种机制,允许应用程序直接访问底层传输协议,绕过操作系统提供的传输层接口。这种套接字通常用于实现新的协议或对现有协议进行低级别的操作。 以下是对原始套接字的详细介绍: 定义与用途 : 原始套接字是直接基于网络层(如IP)的。

    2024年02月07日
    浏览(56)
  • 【Linux网络】网络编程套接字(预备知识+UDP)

    目录 预备知识 1. 理解源IP地址和目的IP地址 2. 理解源MAC地址和目的MAC地址 3. 认识端口号  4. 理解源端口号和目的端口号 5. 端口号(port) vs 进程pid 6. 认识TCP协议和认识UDP协议 7. 网络字节序 socket编程接口  1. socket 常见API 2. sockaddr结构  简单的UDP网络程序  1. 服务端创建udp

    2024年02月19日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包