20-LINUX--网络编程

一. 主机字节序列和网络字节序列

主机字节序列分为大端字节序和小端字节序,不同的主机采用的字节序列可能不同。大
端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址
处。小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的
低地址处。在两台使用不同字节序的主机之间传递数据时,可能会出现冲突。所以,在将数
据发送到网络时规定整形数据使用大端字节序,所以也把大端字节序成为网络字节序列。对
方接收到数据后,可以根据自己的字节序进行转换。
Linux 系统提供如下 4 个函数来完成主机字节序和网络字节序之间的转换:
 #include <netinet/in.h>uint32_t htonl(uint32_t hostlong); // 长整型的主机字节序转网络字节序uint32_t ntohl(uint32_t netlong); // 长整型的网络字节序转主机字节序uint16_t htons(uint16_t hostshort); // 短整形的主机字节序转网络字节序uint16_t ntohs(uint16_t netshort); // 短整型的网络字节序转主机字节序

二.套接字地址结构

1.专用 socket 地址结构

soc
TCP/IP 协议族有 sockaddr_in 和 sockaddr_in6 两个专用 socket 地址结构体,它们分
别用于 IPV4 和 IPV6:
sin_family: 地址族 AF_INETsin_port: 端口号,需要用网络字节序表示sin_addr: IPV4 地址结构:s_addr 以网络字节序表示 IPV4 地址

2.IP 地址转换函数

人们习惯用点分十进制字符串表示 IPV4 地址,但编程中我们需要先把它们转化 为整数方能使用,下面函数可用于点分十进制字符串表示的 IPV4 地址和网络字节序整数表 示的 IPV4 地址之间的转换:

 #include <arpa/inet.h>in_addr_t inet_addr(const char *cp); //字符串表示的 IPV4 地址转化为网络字节序char* inet_ntoa(struct in_addr in); // IPV4 地址的网络字节序转化为字符串表示

3.网络编程接口

1. #include <sys/types.h>
2. #include <sys/socket.h>
3.
4. /*************************************************************
5. socket()创建套接字,成功返回套接字的文件描述符,失败返回-1
6. domain: 设置套接字的协议簇, AF_UNIX AF_INET AF_INET6
7. type: 设置套接字的服务类型 SOCK_STREAM SOCK_DGRAM
8. protocol: 一般设置为 0,表示使用默认协议
9. *************************************************************/
10. int socket(int domain, int type, int protocol);
11.
12. /*************************************************************
13. bind()将 sockfd 与一个 socket 地址绑定,成功返回 0,失败返回-1
14. sockfd 是网络套接字描述符
15. addr 是地址结构
16. addrlen 是 socket 地址的长度
17. **************************************************************/
18. int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
19.
20. /*************************************************************
21. listen()创建一个监听队列以存储待处理的客户连接,成功返回 0,失败返回-1
22. sockfd 是被监听的 socket 套接字
23. backlog 表示处于完全连接状态的 socket 的上限
24. **************************************************************/
25. int listen(int sockfd, int backlog);
26.
27. /*************************************************************
28. accept()从 listen 监听队列中接收一个连接,成功返回一个新的连接 socket,
29. 该 socket 唯一地标识了被接收的这个连接,失败返回-1
30. sockfd 是执行过 listen 系统调用的监听 socket
31. addr 参数用来获取被接受连接的远端 socket 地址
32. addrlen 指定该 socket 地址的长度
33. *************************************************************/
34. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
35.
36. /*************************************************************
37. connect()客户端需要通过此系统调用来主动与服务器建立连接,
134 到图论,学 IT,找好工作
图论科技
38. 成功返回 0,失败返回-1
39. sockfd 参数是由 socket()返回的一个 socket。
40. serv_addr 是服务器监听的 socket 地址
41. addrlen 则指定这个地址的长度
42. *************************************************************/
43. int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
44.
45. /*************************************************************
46. close()关闭一个连接,实际上就是关闭该连接对应的 socket
47. *************************************************************/
48. int close(int sockfd);
49.
50. /**************************************************************
51. TCP 数据读写:
52. recv()读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大小
53. send()往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长
度
54. flags 参数为数据收发提供了额外的控制
55. **************************************************************/
56. ssize_t recv(int sockfd, void *buff, size_t len, int flags);
57. ssize_t send(int sockfd, const void *buff, size_t len, int flags);
58.
59. /**************************************************************
60. UDP 数据读写:
61. recvfrom()读取 sockfd 上的数据,buff 和 len 参数分别指定读缓冲区的位置和大
小
62. src_addr 记录发送端的 socket 地址
63. addrlen 指定该地址的长度
64. sendto()往 socket 上写入数据,buff 和 len 参数分别指定写缓冲区的位置和数据长
度
65. dest_addr 指定接收数据端的 socket 地址
66. addrlen 指定该地址的长度
67. **************************************************************/
68. ssize_t recvfrom(int sockfd, void *buff, size_t len, int flags,
69. struct sockaddr* src_addr, socklen_t *addrlen);
70. ssize_t sendto(int sockfd, void *buff, size_t len, int flags,
71. struct sockaddr* dest_addr, socklen_t addrlen);

三.TCP编程流程

        (1). socket()方法是用来创建一个套接字,有了套接字就可以通过网络进行数据的收发。这也是为什么进行网络通信的程序首先要创建一个套接字。创建套接字时要指定使用的服务类 型,使用 TCP 协议选择流式服务(SOCK_STREAM)。
        (2). bind()方法是用来指定套接字使用的 IP 地址和端口。IP 地址就是自己主机的地址,如果主机没有接入网络,测试程序时可以使用回环地址“127.0.0.1”。端口是一个 16 位的整形值,一般 0-1024 为知名端口,如 HTTP 使用的 80 号端口。这类端口一般用户不能随便使用。其次,1024-4096 为保留端口,用户一般也不使用。4096 以上为临时端口,用户可以使用。在Linux 上,1024 以内的端口号,只有 root 用户可以使用。
        (3).  listen()方法是用来创建监听队列。监听队列有两种,一个是存放未完成三次握手的连接,一种是存放已完成三次握手的连接。listen()第二个参数就是指定已完成三次握手队列的长度。
        (4). accept()处理存放在 listen 创建的已完成三次握手的队列中的连接。每处理一个连接,则  accept()返回该连接对应的套接字描述符。如果该队列为空,则 accept 阻塞。
        (5). connect()方法一般由客户端程序执行,需要指定连接的服务器端的 IP 地址和端口。该方法执行后,会进行三次握手, 建立连接。
        (6).send()方法用来向 TCP 连接的对端发送数据。send()执行成功,只能说明将数据成功写入 到发送端的发送缓冲区中,并不能说明数据已经发送到了对端。send()的返回值为实际写入 到发送缓冲区中的数据长度。
        (7).recv()方法用来接收 TCP 连接的对端发送来的数据。recv()从本端的接收缓冲区中读取数据,如果接收缓冲区中没有数据,则 recv()方法会阻塞。返回值是实际读到的字节数,如果
        (8).recv()返回值为 0, 说明对方已经关闭了 TCP 连接。
        (9).close()方法用来关闭 TCP 连接。此时,会进行四次挥手。
CLI.C
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){exit(1);}struct sockaddr_in saddr; //IPV4地址结构 服务器地址 memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000); //服务器端口saddr.sin_addr.s_addr = inet_addr("127.0.0.1");int n = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(n == -1){printf("connect err\n");exit(1);}char buff[128] = {0};fgets(buff,128,stdin);send(sockfd,buff,strlen(buff)-1,0);memset(buff,0,sizeof(saddr));recv(sockfd,buff,127,0);printf("buff = %s\n",buff);close(sockfd);exit(0);}

SER.C

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接子//tcp SOCK_STREAM//套接子通过网络收发数据if(sockfd == -1){exit(1);}struct sockaddr_in saddr,caddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;//填写地址族saddr.sin_port = htons(6000);//端口saddr.sin_addr.s_addr=inet_addr("127.0.0.1");//IPint res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//绑定if(res ==-1){printf("bind err\n");exit(1);}//创建监听队列listen(sockfd,5);while(1){int len = sizeof(caddr);int c = accept(sockfd,(struct sockaddr*)&caddr,&len);if(c <0){continue;}printf("accept c=%d\n",c);//接收客户端发来的数据char buff[128] = {0};int n = recv(c, buff,127,0);printf("buff = %s\n",buff);//恢复数据send(c,"ok",2,0);close(c);}}

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

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

相关文章

保温杯盖一般是什么材质的?

保温杯盖一般是什么材质的&#xff1f; Pi材料&#xff0c;也称为聚酰亚胺&#xff08;Polyimide&#xff09;&#xff0c;具有多种特殊性能和应用领域&#xff0c;主要作用如下&#xff1a; 1. 高温耐性&#xff1a;Pi材料具有出色的高温稳定性&#xff0c;能够在高温环境下长…

国内常用的项目管理软件有哪些?六大企业级项目管理软件大盘点

一、 奥博思 PowerProject 项目管理软件 官方网址&#xff1a;http://www.powerproject.com.cn 北京奥博思软件技术有限公司自成立以来&#xff0c;一直专注于企业级项目管理软件的开发及解决方案&#xff0c;致力于为各类企业&#xff08;制造业、IT交付、金融、汽车及汽车零…

供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年4月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

什么是检索增强生成(Retrieval Augmented Generation)?RAG 架构如何实现?

检索增强生成&#xff08;Retrieval Augmented Generation&#xff09;时代 在不断发展的生成人工智能世界中&#xff0c;检索增强生成 (RAG) 标志着一项重大进步&#xff0c;它将检索模型的准确性与生成模型的创造性相结合&#xff0c;达到了准确&创新的更高层级。 这种…

Nginx 7层负载均衡的搭建

目录 负载均衡的理解 修改配置文件 测试 1. 选择在 DMZ 区测试&#xff0c;使用 db 服务器进行测试 2.选择在外网测试负载均衡效果 负载均衡的理解 负载均衡&#xff1a;load balancer&#xff0c;简称LB Nginx 既是一个 web 服务器软件&#xff0c;也是一个负载均衡软件&a…

【NLP】文本分类

n-gram 的局限性 n-gram 只能对于填空这样的通顺性问题做出推测&#xff0c;但是没有办法完全解决句子的语义问题&#xff0c;从而无法实现文本的分类 文本的分类&#xff0c;就是将文本在语义的理解下划分到特定的主题下 手工规则 如一些垃圾过滤系统&#xff0c;需要人工制…

企业或者个体户为什么会经营异常?

在复杂多变的市场经济环境中&#xff0c;无论是企业还是个体工商户&#xff0c;都可能遭遇经营异常的情况。及时识别这些预警信号并采取有效措施&#xff0c;对于避免潜在风险、保持健康发展至关重要。本文将深入探讨企业与个体户常见的经营异常类型、识别方法以及应对策略&…

有趣的css - 文字隐身术效果

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是利用动画属性来模拟文字隐身消失的效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样…

php解密工具

在线编辑器 复制如下代码到空白地区: <?php namespace FatSmallTools; class NavicatPassword {protected $version 0;protected $aesKey libcckeylibcckey;protected $aesIv libcciv libcciv ;protected $blowString 3DC5CA39;protected $blowKey null;protected $b…

MCULCD屏驱动方法

MCULCD屏驱动方式 一、LCD简介二、直接采用8080时序驱动LCD三、采用FSMC&#xff08;模拟8080时序&#xff09;驱动LCD1&#xff0c;FSMC简介2&#xff0c;结构框图3&#xff0c;FMC 驱动 LCD 显示配置步骤 一、LCD简介 Liquid Crystal Display&#xff0c;即液晶显示器&#…

GPT-4o 的商业化落地使用场景

今天我想和大家聊一聊 OpenAI 的 GPT-4o。这款令人惊叹的语言模型不仅在技术层面上令人钦佩&#xff0c;也在多种实际应用中展现了巨大的商业潜力。 GPT-4o 是什么&#xff1f; 首先&#xff0c;简单介绍一下 GPT-4o。它是由 OpenAI 开发的一种高级自然语言处理模型&#xff0…

【全开源】keep健身小程序FastAdmin+ThinkPHP+UniApp

基于FastAdminUniApp&#xff08;目前仅支持微信小程序&#xff09;开发的健身相关行业小程序&#xff0c;程序适用于健身房、瑜伽馆、游泳馆、篮球馆等健身培训场所。平台拥有课程售卖、课*程*预*约、多门店管理、私教预约、教练端、会*员*卡办理、在线*商*城、分*销*模块、页…

每日一练 2024.5.16(补2024.5.12)

题目&#xff1a; 给你 n 个项目&#xff0c;编号从 0 到 n - 1 。同时给你一个整数数组 milestones &#xff0c;其中每个 milestones[i] 表示第 i 个项目中的阶段任务数量。 你可以按下面两个规则参与项目中的工作&#xff1a; 每周&#xff0c;你将会完成 某一个 项目中的…

堆的概念及结构

目录 堆的性质&#xff1a; 堆的实现 堆向下调整算法 堆的创建 堆的插入 堆的删除 堆的应用 堆排序 对比冒泡的优势&#xff1a; 代码 头文件 源文件 如果有一个关键码的集合K { &#xff0c; &#xff0c; &#xff0c;…&#xff0c; }&#xff0c;把它的所有元…

JUnit5测试用例

1.用Test注解表示为测试方法 2.使用DisplayName定义别名 3.使用Assertions类的断言方法 使用断言&#xff0c;可以判断方法的实际执行结果和预期结果是否一致 assertEqualsassertTureassertNotNullassertAllassertThrows 下图是预期与实际不同时报错图 4.使用BeforeEach注解&…

SQL操作面试题

1、NULL和 的区别 || MySQL中为什么不用NULL作为默认值 聚合函数&#xff0c;比如SUM、AVG等会忽略NULL&#xff0c;会造成数据的一个分析误差。只能通过COUNT&#xff08;*&#xff09; NULL的话只能通过ISNULL和ISNotNULL去进行判断&#xff0c;而 可以用<,>,等等…

怎么转换视频格式到mp4?格式转换,4种简单方法

转换视频格式到MP4可以使视频在各种设备上播放更加方便&#xff0c;而MP4格式的优势在于其高质量的视频和相对较小的文件大小。怎么转换视频格式到mp4&#xff1f;在本文中&#xff0c;我们将介绍四种简单有效的方法&#xff0c;帮助您快速将视频格式转换为MP4。 无论您是初学…

花花省V6淘宝客APP社交电商自营商城聚合优惠券系统功能介绍

花花省V6淘宝客APP的社交电商自营商城聚合优惠券系统具有多种功能&#xff0c;以满足用户的不同需求。以下是其主要功能的介绍&#xff1a; 首页功能&#xff1a;首页设计包含广告位、淘口令识别、微信登录、淘宝登录等。此外&#xff0c;还有淘宝返佣、拼多多返佣、京东返佣、…

软考:数据流图案例

阅读下列说明和图&#xff0c;回答问题1至问题4。 一、说明 某医院欲开发病人监控系统。该系统通过各种设备监控病人的生命体征&#xff0c;并在生命体征异常时向医生和护理人员报警。该系统的主要功能如下&#xff1a; &#xff08;1&#xff09;本地监控&#xff1a;定期获…