Linux--UDP编程

Linux--UDP编程

2023年7月15日发(作者:)

Linux--UDP编程

Linux是一个开放、免费的操作系统,具有广泛的应用场景,尤其是在网络通信方面。本文将重点介绍在Linux上如何进行UDP编程,帮助读者更好地理解和应用这一技术。

一、UDP概述

UDP(User Datagram Protocol,用户数据报协议)是一种基于无连接、不可靠传输的协议。相比TCP,UDP不需要建立连接、不需要等待确认,数据发送效率更高,但是可能会出现丢失、重复、不按顺序等问题。UDP广泛应用于进行实时数据传输,如音视频、实时游戏等领域。

二、UDP编程基础

在Linux系统中,进行UDP编程需要借助socket接口。socket接口是一种通用的网络编程方式,可以用于TCP和UDP等多种协议。下面简单介绍一下UDP编程的基本步骤。

1.创建UDP socket

int socket(int domain, int type, int protocol);

该函数用于创建一个socket,其中参数:

• domain表示协议族,常用的有AF_INET(IPv4协议族)和AF_INET6(IPv6协议族); • type表示socket类型,这里选择SOCK_DGRAM表示使用UDP协议;

• protocol表示具体的协议,一般设置为0(默认即可)。

示例代码:

```c

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

```

2.绑定本地IP地址和端口号

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

该函数用于将socket绑定到一个IP地址和端口号上,其中参数:

• sockfd是创建的socket文件描述符;

• addr是地址信息结构体指针,包括地址族、IP地址和端口号信息;

• addrlen是地址信息结构体长度。

示例代码:

```c struct sockaddr_in addr;

_family = AF_INET;

_addr.s_addr = htonl(INADDR_ANY); // 绑定本地任意IP地址

_port = htons(port); // 绑定指定端口号

bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

```

3.接收UDP数据报

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct

sockaddr *src_addr, socklen_t *addrlen);

该函数用于从UDP socket接收数据报,其中参数:

• sockfd是socket文件描述符;

• buf是接收数据的缓存区指针;

• len是缓存区大小;

• flags是接收标志,一般设置为0(默认);

• src_addr是返回的数据来源地址信息结构体指针;

• addrlen是地址信息结构体长度。

示例代码:

```c

struct sockaddr_in src_addr;

socklen_t src_addrlen = sizeof(src_addr);

char buf[BUF_SIZE];

ssize_t n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct

sockaddr*)&src_addr, &src_addrlen);

```

4.发送UDP数据报

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

该函数用于向指定地址发送UDP数据报,其中参数:

• sockfd是socket文件描述符;

• buf是待发送的缓存区指针;

• len是缓存区大小;

• flags是发送标志,一般设置为0(默认);

• dest_addr是目标地址信息结构体指针;

• addrlen是地址信息结构体长度。

示例代码:

```c

struct sockaddr_in dst_addr;

dst__family = AF_INET;

dst__addr.s_addr = inet_addr(ip); // 发送的目标IP地址

dst__port = htons(port); // 发送的目标端口号

sendto(sockfd, buf, n, 0, (struct sockaddr*)&dst_addr,

sizeof(dst_addr));

```

三、UDP编程实例

下面给出一个简单的UDP通信代码示例,实现服务器和客户端之间的简单通信。

1.服务器端代码

```c

#include

#include

#include

#include

#include

#include

#define BUF_SIZE 1024

#define DEFAULT_PORT 8080

int main(int argc, char *argv[])

{ int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

if(sockfd < 0) {

perror("socket");

exit(1);

}

struct sockaddr_in addr;

_family = AF_INET;

_addr.s_addr = htonl(INADDR_ANY);

_port = htons(DEFAULT_PORT);

if(bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {

perror("bind");

exit(1);

}

char buf[BUF_SIZE];

struct sockaddr_in src_addr;

socklen_t src_addrlen = sizeof(src_addr);

ssize_t n;

while(1) {

n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct

sockaddr*)&src_addr, &src_addrlen);

buf[n] = '0';

printf("server received: %s", buf);

sendto(sockfd, buf, n, 0, (struct sockaddr*)&src_addr,

src_addrlen);

printf("server sent back: %s", buf);

}

close(sockfd);

return 0;

}

```

2.客户端代码

```c

#include

#include

#include

#include

#include

#include

#include

#define BUF_SIZE 1024

#define DEFAULT_IP "127.0.0.1"

#define DEFAULT_PORT 8080

int main(int argc, char *argv[])

{

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

if(sockfd < 0) {

perror("socket");

exit(1);

}

struct sockaddr_in dst_addr; dst__family = AF_INET;

dst__addr.s_addr = inet_addr(DEFAULT_IP);

dst__port = htons(DEFAULT_PORT);

char buf[BUF_SIZE];

ssize_t n;

while(1) {

fgets(buf, sizeof(buf), stdin);

n = strlen(buf);

sendto(sockfd, buf, n, 0, (struct sockaddr*)&dst_addr,

sizeof(dst_addr));

n = recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);

buf[n] = '0';

printf("client received: %s", buf);

}

close(sockfd);

return 0;

}

```

四、总结

本文简要介绍了Linux上的UDP编程,包括UDP概述、UDP编程基础、UDP编程实例等方面。希望读者可以通过阅读本文,对UDP有更深入的理解,并能够应用到实际的网络应用中。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689406992a243001.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信