网络编程之数据包套接字

数据报套接字提供一种无连接、不可靠的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。使用UDP协议进行数据的传输。

服务端代码

//服务端
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]) {WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, 0);if(sockServer==INVALID_SOCKET)//如果套接字创建失败,则打印错误信息并退出程序。{printf("sock error!");return 0;}SOCKADDR_IN addrServer;addrServer.sin_addr.s_addr = INADDR_ANY;addrServer.sin_family = AF_INET;addrServer.sin_port = htons(6000);if(bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR))==SOCKET_ERROR)//如果绑定失败,则打印错误信息并退出程序。{printf("bind error!");closesocket(sockServer);return 0;}SOCKADDR_IN addrClient;int len=sizeof(addrClient);while(true){char recvData[255];int  ret=recvfrom(sockServer,recvData,255,0,(sockaddr *)&addrClient,&len);//接收来自客户端的UDP数据包if (ret>0){recvData[ret]=0x00;printf("接收到一个连接:%s\r\n",inet_ntoa(addrClient.sin_addr));printf(recvData);//将接收到的数据打印出来}char * sendData="一个来自服务端的UDP数据包\n";//向客户端发送一个消息sendto(sockServer,sendData,strlen(sendData),0,(sockaddr *)&addrClient,len);}closesocket(sockServer);//关闭服务端监听套接字WSACleanup();printf("success!\n");//表示正常运行return 0;
}

客户端代码 

//客户端
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);//设置要连接的服务端的地址信息
SOCKADDR_IN addrServer;
addrServer.sin_family=AF_INET;
addrServer.sin_addr.s_addr=inet_addr("127.0.0.1");
addrServer.sin_port=htons(6000);
int tolen=sizeof(addrServer);char * sendData="一个来自客户端的UDP数据包\n";
sendto(sockClient,sendData,strlen(sendData),0,(sockaddr *)&addrServer,tolen);char recvData[255];
int ret = recvfrom(sockClient,recvData,255,0,(sockaddr *)&addrServer,&tolen);
if(ret>0)
{recvData[ret]=0x00;printf(recvData);
}
closesocket(sockClient);
WSACleanup();printf("success!\n");
return 0;
}

先运行服务端,然后运行客户端

服务端结果如下

客户端结果如下

1、数据包套接字相较于流式套接字特有的两个函数

recvfrom(SOCKET s,char *buf,int len,int flags,struct sockaddr *from,int *fromlen)

s: 套接字描述符,指定要接收数据的套接字。

buf: 指向存放接收数据的缓冲区。

len: 缓冲区的大小,即最大接收数据的长度。

flags: 接收操作的标志,通常设置为0。

from: 指向一个 struct sockaddr 类型的指针,用于存放发送数据的地址信息。

len: 一个指向整型变量的指针,用于指定 from 缓冲区的大小

sendto(SOCKET s,char *buf,int datalen,int flags,sockaddr *to,int tolen)

s: 套接字描述符,指定要发送数据的套接字。

buf: 指向待发送数据的缓冲区。

datalen: 待发送数据的长度。

flags: 发送操作的标志,通常设置为0。

to: 指向一个sockaddr 类型的指针,包含目标地址信息。

len: to缓冲区的大小

2、数据包套接字有两种模式

对等模式

Socket()-->bind()-->recvfrom()-->sendto()-->close()

Socket()-->bind()-->recvfrom()-->sentdo()-->close()

非对等模式(C/S模式)

Socket()-->bind()-->recvfrom()-->sendto()-->close()

Socket()-->sentdo()-->recvfrom()-->close()

跟流式套接字对比,服务器端少了listen()和accept(),客户端少了connect()

C/S模式的无连接套接字编程模型具有以下特点。

(1)应用程序双方是不对等的,服务器要先行启动,处于被动的等待访问的状态,而客户机则可以随时主动地请求访问服务器。两者在进行网络通信时,服务器要经过创建套接字、绑定套接字、交换数据和关闭套接字4个阶段,而客户机不需要进行套接字的绑定。

(2)服务器进程将套接字绑定到众所周知的端口,或事先指定的端口,并且,客户机端必须确切地知道服务器端套接字使用的网络地址。

(3)客户机端套接字使用动态分配的自由端口,不需要进行绑定,服务器端事先也不必知道客户机端套接字使用的网络地址。

(4)客户机端必须首先发送数据报,并在数据报中携带双方的地址;服务器端收到后,才能知道客户机端的地址,才能给客户机端回送数据报。

(5)服务器可以接收多个客户机端的数据。

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

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

相关文章

3D目标检测综述笔记

3D Object Detection for Autonomous Driving: A Review and New Outlooks https://arxiv.org/pdf/2206.09474.pdf 目录 0.background​编辑 1.1表示形式 1.2感知输入 1.3数据集 1.4评估指标 1. LiDAR-based 3D Object Detection 2.数据表征 2.1 point-based​ 2.1.…

2024年天府杯A题论文免费分享,全网首发

天府杯免费分享资料&#xff08;A题论文代码&#xff09;链接&#xff1a;https://pan.baidu.com/s/17QtYt036ORk1xGIDi0JSew 提取码&#xff1a;sxjm 摘要 在近年来&#xff0c;随着科技的快速发展和社会经济的不断进步&#xff0c;科学研究的作用和地位日益凸显。本文基于…

用 SpringBoot+Redis 解决海量重复提交问题

1前言 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求&#xff0c;我们来解释一下幂等的概念&#xff1a;任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义&#xff0c;最终的含义就是 对数据库的影响只能是一次性的&#xff0c;不能重复处理。如何…

如何快速搭建一个ELK环境?

前言 ELK是Elasticsearch、Logstash和Kibana三个开源软件的统称&#xff0c;通常配合使用&#xff0c;并且都先后归于Elastic.co企业名下&#xff0c;故被简称为ELK协议栈。 Elasticsearch是一个实时的分布式搜索和分析引擎&#xff0c;它可以用于全文搜索、结构化搜索以及分…

第4章.精通标准提示,引领ChatGPT精准输出

标准提示 标准提示&#xff0c;是引导ChatGPT输出的一个简单方法&#xff0c;它提供了一个具体的任务让模型完成。 如果你要生成一篇新闻摘要。你只要发送指示词&#xff1a;汇总这篇新闻 : …… 提示公式&#xff1a;生成[任务] 生成新闻文章的摘要&#xff1a; 任务&#x…

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 专题&#xff1a;一个自制代码…

(C++) 属性说明符-标准属性

文章目录 前言标准属性&#x1f3f7;️noreturn⭐(C11) 指示函数不返回 &#x1f3f7;️carries_dependency⭐(C11) 指示在函数内外传播“释放-消费” std::memory_order 中的依赖链 &#x1f3f7;️deprecated⭐(C14) 指示以此属性声明的名字或实体&#xff0c;允许使用但因某…

机器学习之决策树现成的模型使用

目录 须知 DecisionTreeClassifier sklearn.tree.plot_tree cost_complexity_pruning_path(X_train, y_train) CART分类树算法 基尼指数 分类树的构建思想 对于离散的数据 对于连续值 剪枝策略 剪枝是什么 剪枝的分类 预剪枝 后剪枝 后剪枝策略体现之威斯康辛州乳…

Linux基础篇:解析Linux命令执行的基本原理

Linux 命令是一组可在 Linux 操作系统中使用的指令&#xff0c;用于执行特定的任务&#xff0c;例如管理文件和目录、安装和配置软件、网络管理等。这些命令通常在终端或控制台中输入&#xff0c;并以文本形式显示输出结果。 Linux 命令通常以一个或多个单词的简短缩写或单词…

学习vue3第十二节(组件的使用与类型)

1、组件的作用用途 目的&#xff1a; 提高代码的复用度&#xff0c;和便于维护&#xff0c;通过封装将复杂的功能代码拆分为更小的模块&#xff0c;方便管理&#xff0c; 当我们需要实现相同的功能时&#xff0c;我们只需要复用已经封装好的组件&#xff0c;而不需要重新编写相…

(九)图像的高斯低通滤波

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 OpenCV-460.jar 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存储格式的相互转换算法 &#xff08;三…

Flask学习(六):蓝图(Blueprint)

蓝图&#xff08;Blueprint&#xff09;&#xff1a;将各个业务进行区分&#xff0c;然后每一个业务单元可以独立维护&#xff0c;Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法&#xff0c;它并不是必须要实现应用的视图和函数的。 Demo目录结构&#xf…

linux离线安装jenkins及使用教程

本教程采用jenkins.war的方式离线安装部署&#xff0c;在线下载的方式会遇到诸多问题&#xff0c;不宜采用 一、下载地址 地址&#xff1a;Jenkins download and deployment 下载最新的长期支持版 由于jenkins使用java开发的&#xff0c;所以需要安装的linux服务器装有jdk环…

插入排序、归并排序、堆排序和快速排序的稳定性分析

插入排序、归并排序、堆排序和快速排序的稳定性分析 一、插入排序的稳定性二、归并排序的稳定性三、堆排序的稳定性四、快速排序的稳定性总结在计算机科学中,排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定性指的是在排…

新版Idea2023.3.5与lombok冲突、@Data失效

新版idea和lombok冲突&#xff0c;加上Data&#xff0c;其他地方get set也不报错&#xff0c;但是一运行就找不到get set方法。 但是直接使用Getter和Setter可以访问、应该是Data失效了。 解决方法&#xff1a; 看推上介绍是 lombok 与 idea 采集 get 、set 方法的时候所用的技…

Jupyter开启远程服务器(最新版)

Jupyter Notebook 在本地进行访问时比较简单&#xff0c;直接在cmd命令行下输入 jupyter notebook 即可&#xff0c;然而notebook的作用不止于此&#xff0c;还可以用于远程连接服务器&#xff0c;这样如果你有一台服务器内存很大&#xff0c;但是呢你又不喜欢在linux上进行操作…

【C语言】编译和链接----预处理详解【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

如何备考2025年AMC8竞赛?吃透2000-2024年600道真题(免费送题)

最近有家长朋友问我&#xff0c;现在有哪些类似于奥数的比赛可以参加&#xff1f;我的建议可以关注下AMC8的竞赛&#xff0c;类似于国内的奥数&#xff0c;但是其难度要比国内的奥数低一些&#xff0c;而且比赛门槛更低&#xff0c;考试也更方便。比赛的题目尤其是应用题比较有…

Redis开源协议变更!Garnet:微软开源代替方案?

Garnet&#xff1a;微软开源的高性能替代方案&#xff0c;秉承兼容 RESP 协议的同时&#xff0c;以卓越性能和无缝迁移能力重新定义分布式缓存存储&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 最近&#xff0c;Redis修改了开源协议&#xff0c;从BSD变成了 SSPLv…

第二十一章 Jquery ajax

文章目录 1. jquery下载2. jquery的使用3. jquery页面加载完毕执行4. jquery属性控制6. 遍历器 2. ajax1. 准备后台服务器2. ajax发送get请求3. ajax发送post请求 1. jquery下载 点击下载 稳定版本1.9 2. jquery的使用 存放到html文件的同级目录 3. jquery页面加载完毕执行…