图片/在思考的樱木花道

UDP(user datagram protocol)用户数据报协议,属于传输层。

UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方。UDP无需建立类如三次握手的连接,使得通信效率很高。因此UDP适用于一次传输数据量很少、对可靠性要求不高的或对实时性要求高的应用场景。

UDP通信的过程:

服务端:

(1)使用函数socket(),生成套接字文件描述符;

(2)通过struct sockaddr_in 结构设置服务器地址和监听端口;

(3)使用bind() 函数绑定监听端口,将套接字文件描述符和地址类型变量(struct sockaddr_in )进行绑定;

(4)接收客户端的数据,使用recvfrom() 函数接收客户端的网络数据;

(5)向客户端发送数据,使用sendto() 函数向服务器主机发送数据;

(6)关闭套接字,使用close() 函数释放资源;

客户端:

(1)使用socket(),生成套接字文件描述符;

(2)通过struct sockaddr_in 结构设置服务器地址和监听端口;

(3)向服务器发送数据,sendto() ;

(4)接收服务器的数据,recvfrom() ;

(5)关闭套接字,close() ;

  • sockaddr 与 sockaddr_in 区别

https://blog.csdn.net/qingzhuyuxian/article/details/79736821

sendto()

1 1 int sendto(int s, const void *buf, int len, unsigned int flags,
2         const struct sockaddr *to, int tolen);

返回值说明:

成功则返回实际传送出去的字符数,失败返回-1,错误原因会存于errno 中。

参数说明:

  • s:     socket描述符;

  • buf:UDP数据报缓存区(包含待发送数据);

  • len:  UDP数据报的长度;

  • flags:调用方式标志位(一般设置为0);

  • to:  指向接收数据的主机地址信息的结构体(sockaddr_in需类型转换);

  • tolen:to所指结构体的长度;

recvfrom()

1 int recvfrom(int s, void *buf, int len, unsigned int flags,
2           struct sockaddr *from, int *fromlen);

返回值说明:

成功则返回实际接收到的字符数,失败返回-1,错误原因会存于errno 中。

参数说明:

  • s:         socket描述符;

  • buf:      UDP数据报缓存区(包含所接收的数据);

  • len:      缓冲区长度。

  • flags:   调用操作方式(一般设置为0)。

  • from:    指向发送数据的客户端地址信息的结构体(sockaddr_in需类型转换);

  • fromlen:指针,指向from结构体长度值。

示例代码

服务端

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>#define MAXLINE 4096
#define UDPPORT 8001
#define SERVERIP "192.168.255.129"using namespace std;int main(){int serverfd;unsigned int server_addr_length, client_addr_length;char recvline[MAXLINE];char sendline[MAXLINE];struct sockaddr_in serveraddr , clientaddr;// 使用函数socket(),生成套接字文件描述符;if( (serverfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ){perror("socket() error");exit(1);}// 通过struct sockaddr_in 结构设置服务器地址和监听端口;bzero(&serveraddr,sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);serveraddr.sin_port = htons(UDPPORT);server_addr_length = sizeof(serveraddr);// 使用bind() 函数绑定监听端口,将套接字文件描述符和地址类型变量(struct sockaddr_in )进行绑定;if( bind(serverfd, (struct sockaddr *) &serveraddr, server_addr_length) < 0){perror("bind() error");exit(1);}// 接收客户端的数据,使用recvfrom() 函数接收客户端的网络数据;client_addr_length = sizeof(sockaddr_in);int recv_length = 0;recv_length = recvfrom(serverfd, recvline, sizeof(recvline), 0, (struct sockaddr *) &clientaddr, &client_addr_length);cout << "recv_length = "<< recv_length <<endl;cout << recvline << endl;// 向客户端发送数据,使用sendto() 函数向服务器主机发送数据;int send_length = 0;sprintf(sendline, "hello client !");send_length = sendto(serverfd, sendline, sizeof(sendline), 0, (struct sockaddr *) &clientaddr, client_addr_length);if( send_length < 0){perror("sendto() error");exit(1);}cout << "send_length = "<< send_length <<endl;//关闭套接字,使用close() 函数释放资源;close(serverfd);return 0;
}

客户端

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>#define MAXLINE 4096
#define UDPPORT 8001
#define SERVERIP "192.168.255.129"using namespace std;int main(){int confd;unsigned int addr_length;char recvline[MAXLINE];char sendline[MAXLINE];struct sockaddr_in serveraddr;// 使用socket(),生成套接字文件描述符;if( (confd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ){perror("socket() error");exit(1);}//通过struct sockaddr_in 结构设置服务器地址和监听端口;bzero(&serveraddr, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(SERVERIP);serveraddr.sin_port = htons(UDPPORT);addr_length = sizeof(serveraddr);// 向服务器发送数据,sendto() ;int send_length = 0;sprintf(sendline,"hello server!");send_length = sendto(confd, sendline, sizeof(sendline), 0, (struct sockaddr *) &serveraddr, addr_length);if(send_length < 0 ){perror("sendto() error");exit(1);}cout << "send_length = " << send_length << endl;// 接收服务器的数据,recvfrom() ;int recv_length = 0;recv_length = recvfrom(confd, recvline, sizeof(recvline), 0, (struct sockaddr *) &serveraddr, &addr_length);cout << "recv_length = " << recv_length <<endl;cout << recvline << endl;// 关闭套接字,close() ;close(confd);return 0;
}

文章转自:

https://www.cnblogs.com/HpeMephisto/p/11312193.html


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众号

UDP协议 sendto 和 recvfrom 浅析与示例相关推荐

  1. MFC工作笔记0008---UDP协议通信_sendto 和 recvfrom 浅析与示例

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 UDP(user datagram protocol)用户数据报协议,属于传输层. UDP是面向非 ...

  2. 网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom

    1.UDP协议的特点 UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议.在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输. 适用情况: 1.发 ...

  3. Visual C++设计UDP协议通讯示例

    Visual C++设计UDP协议通讯示例 2005-06-06 15:56作者:fs007出处:vckbase责任编辑:方舟 下载本文源代码 一.绪言 UDP是一种面向非连接,不可靠的通讯协议,相对 ...

  4. UDP sendto和recvfrom使用详解

    在网络编程中,UDP运用非常广泛.很多网络协议是基于UDP来实现的,如SNMP等.大家常常用到的局域网文件传输软件飞鸽传书也是基于UDP实现的. 本篇文章跟大家分享linux下UDP的使用和实现,主要 ...

  5. C++设计UDP协议通讯示例

    UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高 一.绪言 UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高.所以在 ...

  6. UDP 编程中的sendto() 与recvfrom()解析(转)

    sendto() 简述: 向一指定目的地发送数据. include int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int ...

  7. 【计算机网络】浅析UDP协议

    1.了解UDP 1.1 UDP是什么 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系 ...

  8. Socket:UDP协议小白

    UDP(user datagram protocol)用户数据报协议,属于传输层. 首先要搞清楚网络通信的几个层次: OSI 是 Open System Interconnection 的缩写,译为& ...

  9. 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

    基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socketserver = socket.socket(socket.AF_INET,socket.S ...

最新文章

  1. [TypeScript] Using Interfaces to Describe Types in TypeScript
  2. Netty开发的基本流程及关键类说明
  3. 【数据仓库】Hive环境搭建和基础用法
  4. 容器源码解析之容器全貌(一)
  5. leetcode 628. 三个数的最大乘积(排序)
  6. html5怎么跟安卓交互,html5怎么与android交互
  7. Tempter of the Bone
  8. Go -- 并发编程的两种限速方法
  9. kafka是什么_Kafka凭什么速度那么快?
  10. UVA 167 - The Sultan's Successors
  11. iOS POST 上传图片
  12. 使用 Python 进行科学计算 使用 Python 进行科学计算
  13. OSChina 周三乱弹 —— 领悟人生,一百块钱都不给?
  14. java-获取上个月的第一天和最后一天
  15. 【异常】Reason: Executor heartbeat timed out after 140927 ms
  16. 语法基础(三. 类,属性,方法,方法重载,方法重写,构造方法,访问修饰符)
  17. 在高分辨率或者扩展屏下微信截图出现放大问题的解决
  18. ActiveMQ学习(二)——MQ的工作原理
  19. 怎样用一台手机做自媒体?
  20. 计算机网络实验一层二叉树,2016考研计算机冲刺考点梳理:二叉树算法(1)

热门文章

  1. 百度AI Access Token过期处理
  2. Paper reading (八十):Persistent microbiome alterations modulate the rate of post-dieting weight regain
  3. Oracle 数据导入
  4. RJ45和RJ11的区别?
  5. 摩托车无法启动的原因
  6. SQL 数据类型 之 数字类型
  7. linux下复制文件
  8. laravel 中文语言包
  9. WiFi共享精灵在使用时出现的错误代码1的解决方法
  10. 32位Oracle客户端的下载及64位Windows下的安装