UDP协议 sendto 和 recvfrom 浅析与示例
图片/在思考的樱木花道
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 浅析与示例相关推荐
- MFC工作笔记0008---UDP协议通信_sendto 和 recvfrom 浅析与示例
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 UDP(user datagram protocol)用户数据报协议,属于传输层. UDP是面向非 ...
- 网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom
1.UDP协议的特点 UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议.在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输. 适用情况: 1.发 ...
- Visual C++设计UDP协议通讯示例
Visual C++设计UDP协议通讯示例 2005-06-06 15:56作者:fs007出处:vckbase责任编辑:方舟 下载本文源代码 一.绪言 UDP是一种面向非连接,不可靠的通讯协议,相对 ...
- UDP sendto和recvfrom使用详解
在网络编程中,UDP运用非常广泛.很多网络协议是基于UDP来实现的,如SNMP等.大家常常用到的局域网文件传输软件飞鸽传书也是基于UDP实现的. 本篇文章跟大家分享linux下UDP的使用和实现,主要 ...
- C++设计UDP协议通讯示例
UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高 一.绪言 UDP是一种面向非连接,不可靠的通讯协议,相对于TCP来说,虽然可靠性不及,但传输效率较高.所以在 ...
- UDP 编程中的sendto() 与recvfrom()解析(转)
sendto() 简述: 向一指定目的地发送数据. include int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int ...
- 【计算机网络】浅析UDP协议
1.了解UDP 1.1 UDP是什么 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系 ...
- Socket:UDP协议小白
UDP(user datagram protocol)用户数据报协议,属于传输层. 首先要搞清楚网络通信的几个层次: OSI 是 Open System Interconnection 的缩写,译为& ...
- 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程
基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socketserver = socket.socket(socket.AF_INET,socket.S ...
最新文章
- [TypeScript] Using Interfaces to Describe Types in TypeScript
- Netty开发的基本流程及关键类说明
- 【数据仓库】Hive环境搭建和基础用法
- 容器源码解析之容器全貌(一)
- leetcode 628. 三个数的最大乘积(排序)
- html5怎么跟安卓交互,html5怎么与android交互
- Tempter of the Bone
- Go -- 并发编程的两种限速方法
- kafka是什么_Kafka凭什么速度那么快?
- UVA 167 - The Sultan's Successors
- iOS POST 上传图片
- 使用 Python 进行科学计算 使用 Python 进行科学计算
- OSChina 周三乱弹 —— 领悟人生,一百块钱都不给?
- java-获取上个月的第一天和最后一天
- 【异常】Reason: Executor heartbeat timed out after 140927 ms
- 语法基础(三. 类,属性,方法,方法重载,方法重写,构造方法,访问修饰符)
- 在高分辨率或者扩展屏下微信截图出现放大问题的解决
- ActiveMQ学习(二)——MQ的工作原理
- 怎样用一台手机做自媒体?
- 计算机网络实验一层二叉树,2016考研计算机冲刺考点梳理:二叉树算法(1)