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条)