首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

UDP sendto和recvfrom使用详解

嵌入式 | 发布时间:2018-11-28 | 人气: | #评论# | 本文关键字:UDP,sendto,recvfrom
摘要:在网络编程中,UDP运用非常广泛。很多网络协议是基于UDP来实现的,如SNMP等。大家常常用到的局域网文件传输软件飞鸽传书也是基于UDP实现的。 本篇文章跟大家分享linux下UDP的使用和实现,主

在网络编程中,UDP运用非常广泛。很多网络协议是基于UDP来实现的,如SNMP等。大家常常用到的局域网文件传输软件飞鸽传书也是基于UDP实现的。

本篇文章跟大家分享linux下UDP的使用和实现,主要介绍下sendto()和recvfrom()两个函数的使用,以及INADDR_ANY的说明,并在最后展示了一个经过自己测试可用的UDP Server和UDP Client的代码示例。

头文件

1#include <sys/types.h>
2#include <sys/socket.h>

函数原型

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

 

函数说明

sendto(),是把UDP数据报发给指定地址;recvfrom()是从指定地址接收UDP数据报。

参数说明

  • \s:              socket描述符。

  • \buf:         UDP数据报缓存地址。

  • \len:          UDP数据报长度。

  • \flags:       该参数一般为0。

  • \to:            sendto()函数参数,struct sockaddr_in类型,指明UDP数据发往哪里报。

  • \tolen:      对方地址长度,一般为:sizeof(struct sockaddr_in)。

  • \fromlen:recvfrom()函数参数,struct sockaddr_in类型,指明从哪里接收UDP数据报。

函数返回值

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

对于recvfrom()函数,成功则返回接收到的字符数,失败则返回-1,错误原因存于errno中。

struct sockaddr_in结构体

该结构体的定义如下:

01/* Structure describing an Internet (IP) socket address. */
02#define __SOCK_SIZE__   16      /* sizeof(struct sockaddr)  */
03struct sockaddr_in {
04  sa_family_t       sin_family; /* Address family       */
05  __be16        sin_port;   /* Port number          */
06  struct in_addr    sin_addr;   /* Internet address     */
07
08  /* Pad to size of `struct sockaddr'. */
09  unsigned char     __pad[__SOCK_SIZE__ - sizeof(short int) -
10            sizeof(unsigned short int) - sizeof(struct in_addr)];
11};

其中,sin_family指明地址族,一般使用AF_INET:

1#define AF_INET     2   /* Internet IP Protocol     */

sin_port:指明UDP端口;sin_addr指明IP地址:

1/* Internet address. */
2