UDP协议 sendto 和 recvfrom 浅析与示例

UDP协议 sendto 和 recvfrom 浅析与示例UDP(userdatagramprotocol)用户数据报协议,属于传输层。UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方。UDP无需建立类如三次握手的连接,使得通信效

大家好,又见面了,我是你们的朋友全栈君。

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

  UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方。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结构体长度值。

 

示例代码

服务端

<span role="heading" aria-level="2">UDP协议 sendto 和 recvfrom 浅析与示例
<span role="heading" aria-level="2">UDP协议 sendto 和 recvfrom 浅析与示例

 1 #include <unistd.h>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include <iostream>
 5 #include <netinet/in.h>
 6 #include <sys/socket.h>
 7 #include <sys/types.h>
 8 #include <arpa/inet.h>
 9 
10 #define MAXLINE 4096
11 #define UDPPORT 8001
12 #define SERVERIP "192.168.255.129"
13 
14 using namespace std;
15 
16 int main(){
17     int serverfd;
18     unsigned int server_addr_length, client_addr_length;
19     char recvline[MAXLINE];
20     char sendline[MAXLINE];
21     struct sockaddr_in serveraddr , clientaddr;
22 
23     // 使用函数socket(),生成套接字文件描述符;
24     if( (serverfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ){
25         perror("socket() error");
26         exit(1);
27     }
28 
29     // 通过struct sockaddr_in 结构设置服务器地址和监听端口;
30     bzero(&serveraddr,sizeof(serveraddr));
31     serveraddr.sin_family = AF_INET;
32     serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
33     serveraddr.sin_port = htons(UDPPORT);
34     server_addr_length = sizeof(serveraddr);
35 
36     // 使用bind() 函数绑定监听端口,将套接字文件描述符和地址类型变量(struct sockaddr_in )进行绑定;
37     if( bind(serverfd, (struct sockaddr *) &serveraddr, server_addr_length) < 0){
38         perror("bind() error");
39         exit(1); 
40     }
41     
42     // 接收客户端的数据,使用recvfrom() 函数接收客户端的网络数据;
43     client_addr_length = sizeof(sockaddr_in);
44     int recv_length = 0;
45     recv_length = recvfrom(serverfd, recvline, sizeof(recvline), 0, (struct sockaddr *) &clientaddr, &client_addr_length);
46     cout << "recv_length = "<< recv_length <<endl;
47     cout << recvline << endl;
48     
49     // 向客户端发送数据,使用sendto() 函数向服务器主机发送数据;
50     int send_length = 0;
51     sprintf(sendline, "hello client !");
52     send_length = sendto(serverfd, sendline, sizeof(sendline), 0, (struct sockaddr *) &clientaddr, client_addr_length);
53     if( send_length < 0){
54         perror("sendto() error");
55         exit(1);
56     }
57     cout << "send_length = "<< send_length <<endl;
58     
59     //关闭套接字,使用close() 函数释放资源;
60     close(serverfd);
61 
62     return 0;
63 }

View Code

 

客户端

<span role="heading" aria-level="2">UDP协议 sendto 和 recvfrom 浅析与示例
<span role="heading" aria-level="2">UDP协议 sendto 和 recvfrom 浅析与示例

 1 #include <unistd.h>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include <iostream>
 5 #include <netinet/in.h>
 6 #include <sys/socket.h>
 7 #include <sys/types.h>
 8 #include <arpa/inet.h>
 9 
10 #define MAXLINE 4096
11 #define UDPPORT 8001
12 #define SERVERIP "192.168.255.129"
13 
14 using namespace std;
15 
16 int main(){
17     int confd;
18     unsigned int addr_length;
19     char recvline[MAXLINE];
20     char sendline[MAXLINE];
21     struct sockaddr_in serveraddr;
22 
23     // 使用socket(),生成套接字文件描述符;
24     if( (confd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ){
25         perror("socket() error");
26         exit(1);
27     }
28 
29     //通过struct sockaddr_in 结构设置服务器地址和监听端口;
30     bzero(&serveraddr, sizeof(serveraddr));
31     serveraddr.sin_family = AF_INET;
32     serveraddr.sin_addr.s_addr = inet_addr(SERVERIP);
33     serveraddr.sin_port = htons(UDPPORT);
34     addr_length = sizeof(serveraddr);
35 
36     // 向服务器发送数据,sendto() ;
37     int send_length = 0;
38     sprintf(sendline,"hello server!");
39     send_length = sendto(confd, sendline, sizeof(sendline), 0, (struct sockaddr *) &serveraddr, addr_length);
40     if(send_length < 0 ){
41         perror("sendto() error");
42         exit(1);
43     }
44     cout << "send_length = " << send_length << endl;
45 
46     // 接收服务器的数据,recvfrom() ;
47     int recv_length = 0;
48     recv_length = recvfrom(confd, recvline, sizeof(recvline), 0, (struct sockaddr *) &serveraddr, &addr_length);
49     cout << "recv_length = " << recv_length <<endl;
50     cout << recvline << endl; 
51 
52     // 关闭套接字,close() ;
53     close(confd);
54 
55     return 0;
56 }

View Code

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155014.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月1日 下午11:36
下一篇 2022年7月1日 下午11:36


相关推荐

  • 由于找不到MSVCR110.dll,无法继续执行代码…解决办法

    由于找不到MSVCR110.dll,无法继续执行代码…解决办法本人的电脑是 64 位系统 想安装 wamp3 0 6 但是安装后打开软件时会提示 上面这张图是我在网上找的 我当时的提示是由于找不到 MSVCR110 dll 为解决这个问题 百度了好多尝试了好多 大多数都是说去微软官网下载之类的就能解决 当然可能是下载其他版本的 比如 2015 版本的 但是照做了我还是无法解决 经过各种尝试后发现 解决办法 安装 VC 运行库合集

    2026年3月26日
    2
  • 深度解析:Claude Code 和 OpenClaw 底层架构的设计取舍

    深度解析:Claude Code 和 OpenClaw 底层架构的设计取舍

    2026年3月14日
    4
  • ARP–利用arpspoof和driftnet工具进行arp欺骗

    ARP–利用arpspoof和driftnet工具进行arp欺骗实验目的:1.了解ARP欺骗的原理。2.对ARP欺骗进行进一步的认识并提出防范措施。3.掌握熟悉arpspoof和driftnet的使用方法。任务与要求:1、利用arpspoof进行ARP断网攻击2.利用arpspoof工具和driftnet工具进行ARP欺骗原理:ARP(AddressResolutionProtocol)是地址解析协议,是一种将IP地址转化成物理地址的协议。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。ARP具体说来就…

    2026年4月15日
    4
  • 数据挖掘面试 150 道题(附答案)

    数据挖掘面试 150 道题(附答案)单选题1.某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题?(A)A.关联规则发现B.聚类C.分类D.自然语言处理2.以下两种描述分别对应哪两种对分类算法的评价标准?(A)(a)警察抓小偷,描述警察抓的人中有多少个是小偷的标准。(b)描述有多少比例的小偷给警察抓了的标准。A.Precision,…

    2022年6月26日
    82
  • 淘宝桌面OpenClaw插件版配置指南

    淘宝桌面OpenClaw插件版配置指南

    2026年3月12日
    6
  • 【数据结构与算法】详解什么是双向链表,并用代码手动实现一个双向链表

    【数据结构与算法】详解什么是双向链表,并用代码手动实现一个双向链表上一篇文章讲解了链表的相关知识 并用代码实现了一个链表结构 那么本文将介绍一下另一种特殊的链表结构 叫做双向链表 顾名思义 普通的链表都是从 head 开始往后遍历结构内的元素 那么双向链表就是既可以从头开始遍历 又可以从结构的末尾开始遍历 上一篇文章的跳转链接 本文就来详细讲解一下双向链表的概念以及如何实现一个双向链表 公众号 Lpyexplore 的编程小屋关注我 每天更新 带你在 python 爬虫的过程中学习前端 还有更多电子书和面试题等你来拿数据结构 双向链表一 什么是双向链表二

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号