网络编程:TCP和UDP

一、通信模式

1.1 套接字socket

1.网络通信通过套接字进行数据传输

2.socket是一个函数,为通信创建一个端点,并返回该端点的文件描述符

3.套接字本身是一个文件描述符,对应的是一个特殊的文件,该文件描述符维护了两个缓冲区,分别是发送缓冲区和接收缓冲区

4.套接字可以实现全双工的通信

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

功能:创建用于通信的一个端点,并返回对应的文件描述符,文件描述符按最小未使用原则分配 参数1:规定通信域

        AF_UNIX, AF_LOCAL     同一主机之间多进程通信      具体内容可查看 man 7 unix

        AF_INET IPv4                 网络通信                                具体内容可查看 man 7 ip

参数2:传输方式或类型

SOCK_STREAM     支持TCP通信方式

SOCK_DGRAM       支持UDP通信方式

SOCK_RAW            支持原始套接字通信

参数3:协议

如果第二参数指定了SOCK_STREAM或SOCK_DGRAM则第三个参数填0

如果第二个参数为SOCK_RAW,则第三个参数需要指定对应的协议

        对于TCP通信:IPPROTO_TCP

        对于UDP通信:IPPROTO_UDP

返回值:成功返回创建出的套接字文件描述符,失败返回-1并置位错误码

二、TCP通信

2.2相关API

bind:绑定端口号和IP地址

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

listen:启动被动监听

int listen(int sockfd, int backlog);

accept :阻塞等待客户端的连接请求

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

send/recv:数据发送和接收函数

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);

connect:连接函数

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

2.3TCP服务器代码

#include <head.h>#define SER_PORT 8888           //服务器端口号
#define SER_IP "192.168.117.94"//服务器IP
int main(int argc, const char *argv[])
{//1.创建一个套接字int sfd=socket(AF_INET,SOCK_STREAM,0);
//if(sfd==-1){perror("socket");return -1;}printf("%d sfd=%d\n",__LINE__,sfd);//主动去连接别人//2.绑定ip地址和端口号//2.1填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET; //地址族   IPV4网络通信sin.sin_port=htons(SER_PORT);//端口号   将主机字节序转换为网络字节序sin.sin_addr.s_addr=inet_addr(SER_IP);//ip地址 将点分十进制的ip地址转换为4字节无符号整数的网络字节序//2.2绑定if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1){printf("bind");return -1;}printf("%d bind success\n",__LINE__); //将套接字设置成被动监听状态if(listen(sfd,128)==-1){perror("listen");return -1;}printf("%d listen success\n",__LINE__);//4.阻塞等待客户端的连接请求int newfd=-1;//定义结构体变量接受对方地址信息结构体struct sockaddr_in cin;//用于接收客户端地址信息结构体socklen_t addrlen =sizeof(cin);//用于接收客户端结构体的大小if((newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen))==-1){ //阻塞等待客户端的连接请求perror("accept");return -1;}printf("%s  %d:发来连接请求\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));//                      将网络字节序转换为十进制的字符串(ip地址)  网络字节序转换成主机字节序(端口号)//5.收发数据char rbuf[128]="0";//用于接收客户发来的数据while(1){//将容器清空bzero(rbuf,sizeof(rbuf));//memset(rbuf,0,sizeof(rbuf));//从套接字重读取数据int res=recv(newfd,rbuf,sizeof(rbuf)-1,0);if(res==0){printf("客户端已经下线\n");break;}printf("%s  %d:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);//加个笑脸再发回去strcat(rbuf,"*_*");send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}//6.关闭服务器
close(newfd);
close(sfd);return 0;
}

2.4TCP客户端代码

#include <head.h>#define SER_PORT 7777
#define SER_IP "192.168.117.96"
#define CLI_PORT 6666
#define CLI_IP "192.168.117.96"
int main(int argc, char const *argv[])
{//1.创建用于连接的客户端套接字int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd==-1){perror("socket");return -1;}printf("socet success cfd=%d\n",cfd);//设置端口号快速重用int reuse = 1;if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) ==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2.绑定端口号和ip地址(非必须) 如果不写的系统会随机给//2.1填充客户端地址信息结构体struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);//2.2绑定端口号和IPif(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind");return -1;}printf("bind success\n");//3.连接服务器//3.1填充要连接服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;//地址族sin.sin_port=htons(SER_PORT);//服务器端口号sin.sin_addr.s_addr=inet_addr(SER_IP);//服务器的IP地址//3.2连接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect");return -1;}printf("连接成功\n");//4.收发数据char wbuf[128]="0";while(1){printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);//从终端上获取一个字符串wbuf[strlen(wbuf)-1]='\0';//将换行换成'\0'//判断输入的字符串值if(strcmp(wbuf,"quit")==0)break;//将数据发送给服务器send(cfd,wbuf,strlen(wbuf),0);//将字符数组清空bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf)-1,0);printf("收到服务器消息为%s\n",wbuf);}//5.关闭套接字close(cfd);return 0;
}

2.5效果演示

三、UDP通信

3.1通信模型

3.2相关API

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

功能:从套接字文件描述符中读取len个字节的数据,将数据放入buf起始地址的容器中,并接收对端的地址信息结构体

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

功能:向对端套接字中发送数据

3.3UDP服务器代码

#include <head.h>
#define SER_PORT 6666
#define SER_IP "192.168.118.60"int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}printf("socket success sfd = %d\n", sfd);        //3//设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) ==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、绑定IP地址和端口号//2.1填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);//2.2 绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}//3、数据收发char rbuf[128] = "";//定义接收对端地址信息结构体的容器struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);while(1){//清空容器bzero(rbuf, sizeof(rbuf));//接收数据recvfrom(sfd, rbuf, sizeof(rbuf)-1, 0, (struct sockaddr*)&cin, &addrlen);printf("[%s:%d] :%s\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);//连接一个笑脸回过去strcat(rbuf, "*_*");if(sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cin, sizeof(cin)) == -1){perror("write error");return -1;}}//4、关闭套接字close(sfd);return 0;
}

3.4UDP客户端代码

#include <head.h>
#define SER_PORT 6666
#define SER_IP "192.168.118.60"
#define CLI_PORT 7777
#define CLI_IP "192.168.118.60"int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd == -1){perror("socket error");return -1;}printf("socket success cfd = %d\n", cfd);//2、绑定IP地址和端口号//2.1 填充客户端地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(CLI_PORT);cin.sin_addr.s_addr = inet_addr(CLI_IP);//2.2 绑定if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、数据收发char wbuf[128] = "";//填充要发送的对端的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);while(1){printf("请输入>>>");fgets(wbuf, sizeof(wbuf), stdin);    //从终端获取一个字符串wbuf[strlen(wbuf)-1] = 0;          //将换行换成'\0'//判断输入的是否为退出if(strcmp(wbuf, "quit") == 0){break;}//将数据发送给服务器sendto(cfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&sin, sizeof(sin));printf("发送成功\n");//接收服务器发来的消息bzero(wbuf, sizeof(wbuf));read(cfd, wbuf, sizeof(wbuf)-1);printf("收到服务器消息为:%s\n", wbuf);}//4、关闭套接字close(cfd);return 0;
}

3.5效果演示

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

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

相关文章

MySQL一些命令记录

查看数据引擎 show engines;创建数据库,并选择库 CREATE DATABASE IF NOT EXISTS test_database; USE test_database;创建表 CREATE TABLE IF NOT EXISTS test_table (id INT AUTO_INCREMENT PRIMARY KEY,field1 VARCHAR(50),field2 VARCHAR(50),field3 VARCHAR(50),field4 …

PHP中的反序列化漏洞

PHP中的反序列化漏洞 目录 PHP 中的序列化与反序列化 概述 序列化 基本类型的序列化 对象的序列化 反序列化 示例序列化与反序列化 反序列化漏洞 - PHP 中的魔术方法 - Typecho_v1.0 中的反序列化漏洞 POP链的构造思路 pop链案例 反序列化逃逸 字符串逃逸&#xff…

Linux安装使用one-api 格式访问所有的大模型

One API ✨ 通过标准的 OpenAI API 格式访问所有的大模型&#xff0c;开箱即用 ✨ [!NOTE] 本项目为开源项目&#xff0c;使用者必须在遵循 OpenAI 的使用条款以及法律法规的情况下使用&#xff0c;不得用于非法用途。 根据《生成式人工智能服务管理暂行办法》的要求&#xff…

Android 音频系统

导入 早期Linux版本采用的是OSS框架&#xff0c;它也是Unix及类Unix系统中广泛使用的一种音频体系。 ALSA是Linux社区为了取代OSS而提出的一种框架&#xff0c;是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后&#xff0c;OSS就逐步…

代码随想录day20(2)二叉树:完全二叉树节点个数(leetcode222)

题目要求&#xff1a;求一个完全二叉树的节点个数 思路&#xff1a;首先完全二叉树可以用普通二叉树的方法来求&#xff0c;但是需要遍历所有的节点。 但是对于完全二叉树来说&#xff0c;只有最底层右侧的节点可能没满&#xff0c;其余每层节点都达到了最大值。所以我们可以…

智慧城管:街面秩序沿街商铺视频可视化AI智能监管方案

一、背景分析 随着城市化的加速和商业活动的日益繁荣&#xff0c;沿街商铺的管理面临着越来越多的挑战。沿街商户的乱堆乱放、占道经营、违章停车等违法行为&#xff0c;一直以来都是城市管理中的难题。这不仅存在交通安全隐患&#xff0c;也造成了市容秩序混乱&#xff0c;严…

MFMailComposeViewController 发送邮件

通过 MFMailComposeViewController 发送邮件,需预先登录邮箱账号的情况下; 具体实现与配置参数请参考如下: 首先,引入 MFMailComposeViewController 库 #import <MessageUI/MessageUI.h> 其次,实现相关 api 方法 if ([MFMailComposeViewController canSendMail]) {MFM…

整型变量的原子操作

什么是原子操作 原子操作&#xff08;Atomic Operation&#xff09;是指不可中断的操作&#xff0c;即在多线程环境下&#xff0c;当一个线程在执行原子操作时&#xff0c;不会被其他线程的调度和中断所影响。这种操作在多线程编程中尤为重要&#xff0c;因为它能保证操作的原…

从零开始搭建医保购药APP:技术选择与开发流程

医保购药APP作为一种创新的医疗服务工具&#xff0c;为用户提供了便捷的医保购药流程&#xff0c;同时也为医疗机构提供了更高效的管理和服务方式。今天小编将为大家讲解如何从零开始搭建一款医保购药APP&#xff0c;包括技术选择和开发流程。 一、技术选择 在搭建医保购药APP…

openssl3.2 - note - Decoders and Encoders with OpenSSL

文章目录 openssl3.2 - note - Decoders and Encoders with OpenSSL概述笔记编码器/解码器的调用链OSSL_STORE 编码器/解码器的名称和属性OSSL_FUNC_decoder_freectx_fnOSSL_FUNC_encoder_encode_fn官方文档END openssl3.2 - note - Decoders and Encoders with OpenSSL 概述 …

js-循环返回多条数据,每条数据文本超过三行进行展开与收起的实现

1.基本需求 返回多条数据&#xff0c;每条数据在一定宽度的盒子内&#xff0c;文本超过三行进行文本的展开与收起 2.实现逻辑 对于返回的每条数据添加属性expend&#xff1a;false来在循环中进行对于展开收起的判断。 动态计算盒子宽度随着分辨率的变化而变化的值boxWidth。获…

基于单片机的智能环境监测系统

摘 要 本设计主要由温湿度检测、烟雾检测电路、报警电路、显示电路和人体检测等模块组成。温湿度检测部分使用的是DHT11这种型号的温湿度传感器。DHT11是一种单总线型数字式温湿度传感器&#xff0c;它具有误差小、分辨率高、抗干扰能力强等特点。在烟雾检测电路模块当中&…

Nginx 隐藏版本号

只是隐藏 Nginx 版本号&#xff0c;只需在 Nginx 配置文件全局段添加 server_tokens off 然后重启 Nginx 服务 默认安装好了的 Nginx 服务 查看版本 现在修改配置 重启 Nginx 版本信息看不到了 我们下期见&#xff0c;拜拜&#xff01;

Win11安装Plsql140报错2503

一、安装异常 二、解决办法 出现上述问题&#xff0c;主要是因为msi包安装的权限问题&#xff0c;使用管理员权限安装即解决 。cmd控制台以管理员身份打开WINR&#xff09;->(SHIFTCTRLRNTER)&#xff0c;进入到msi安装包目录下&#xff0c;以管理员身份安装即可&#xff1…

mysql数据库:使用 bash脚本 + 定时任务 自动备份数据

mysql数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏…

LeetCode28.找出字符串中第一个匹配项

28.找出字符串中第一个匹配项 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入…

“优化消费环境 维护消费者权”荥阳市城关乡社工站开展3·15宣传志愿活动

又是一年“315”&#xff0c;为提高辖区群众消费维权意识&#xff0c;让他们可以学会运用政策法律知识维护自身合法权益&#xff0c;同时也为营造出辖区良好营商环境。2024年3月15日&#xff0c;在荥阳市民政局、荥阳市市场监督管理局、城关乡人民政府的支持下&#xff0c;城关…

“值此春意,共享蓝天”—携手植新绿·静待成荫时

种竹交加翠&#xff0c;栽桃烂漫红。——唐杜甫《春日江村》 春风十里&#xff0c;万物生长。春风吹拂绿色现&#xff0c;树吐嫩芽花鲜艳。植树正是好季节&#xff0c;男女老少齐挥铲。种下棵棵小树苗&#xff0c;辛勤培育勤浇灌。来年长成苍天木&#xff0c;绿树成荫美景见。 …

基于ElasticSearch存储海量AIS数据:时空立方体索引篇

文章目录 引言I 时间维切分II 空间范围切分引言 索引结构制约着查询请求的类型和处理方式,索引整体架构制约着查询请求的处理效率。随着时间推移,AIS数据在空间分布上具备局部聚集性,如 果简单地将所有AIS数据插入一个索引结构,随着数据量增长,索引的更新效率、查询效率及…

RabbitMQ 模拟实现【六】:程序模拟实现

文章目录 模拟实现模拟消费者模拟生产者效果展示 启动结果如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/71841546ad8043f1bd51e4408df791de.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f6e3e72ff9a4483c978ec48e24f075c2.p…