linux c 封装udp 客户端服务端接口
时间: 2023-08-10 15:32:31 浏览: 72
以下是一个简单的封装了UDP客户端和服务端的接口的示例代码:
```c
// udp.h
#ifndef UDP_H
#define UDP_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
typedef struct {
int sockfd;
struct sockaddr_in addr;
} udp_socket;
// 初始化UDP客户端
int udp_client_init(udp_socket *sock, const char *ip, int port);
// 发送数据到指定地址
int udp_sendto(udp_socket *sock, const char *ip, int port, const char *data, int len);
// 接收数据
int udp_recvfrom(udp_socket *sock, char *ip, int *port, char *buf, int len);
// 关闭UDP连接
void udp_close(udp_socket *sock);
// 初始化UDP服务端
int udp_server_init(udp_socket *sock, const char *ip, int port);
// 监听端口并接收数据
int udp_server_recv(udp_socket *sock, char *ip, int *port, char *buf, int len);
#endif
```
```c
// udp.c
#include "udp.h"
int udp_client_init(udp_socket *sock, const char *ip, int port) {
// 创建socket
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return -1;
}
// 设置服务器地址
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_port = htons(port);
sock->sockfd = sockfd;
sock->addr = addr;
return 0;
}
int udp_sendto(udp_socket *sock, const char *ip, int port, const char *data, int len) {
// 设置目标地址
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_port = htons(port);
// 发送数据
int ret = sendto(sock->sockfd, data, len, 0, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0) {
perror("sendto");
return -1;
}
return 0;
}
int udp_recvfrom(udp_socket *sock, char *ip, int *port, char *buf, int len) {
// 接收数据
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
int ret = recvfrom(sock->sockfd, buf, len, 0, (struct sockaddr *)&addr, &addrlen);
if (ret < 0) {
perror("recvfrom");
return -1;
}
// 获取发送方IP地址和端口号
strcpy(ip, inet_ntoa(addr.sin_addr));
*port = ntohs(addr.sin_port);
return ret;
}
void udp_close(udp_socket *sock) {
close(sock->sockfd);
}
int udp_server_init(udp_socket *sock, const char *ip, int port) {
// 创建socket
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return -1;
}
// 设置服务器地址
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);
addr.sin_port = htons(port);
// 绑定端口
int ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0) {
perror("bind");
return -1;
}
sock->sockfd = sockfd;
sock->addr = addr;
return 0;
}
int udp_server_recv(udp_socket *sock, char *ip, int *port, char *buf, int len) {
// 接收数据
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
int ret = recvfrom(sock->sockfd, buf, len, 0, (struct sockaddr *)&addr, &addrlen);
if (ret < 0) {
perror("recvfrom");
return -1;
}
// 获取发送方IP地址和端口号
strcpy(ip, inet_ntoa(addr.sin_addr));
*port = ntohs(addr.sin_port);
return ret;
}
```
使用示例:
```c
// client.c
#include "udp.h"
int main() {
udp_socket sock;
udp_client_init(&sock, "127.0.0.1", 8888);
char buf[1024];
sprintf(buf, "Hello, server!");
udp_sendto(&sock, "127.0.0.1", 8888, buf, strlen(buf));
udp_close(&sock);
return 0;
}
```
```c
// server.c
#include "udp.h"
int main() {
udp_socket sock;
udp_server_init(&sock, "127.0.0.1", 8888);
char buf[1024];
char ip[16];
int port;
udp_server_recv(&sock, ip, &port, buf, sizeof(buf));
printf("Received message from %s:%d: %s\n", ip, port, buf);
udp_close(&sock);
return 0;
}
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)