linux udp封装函数

本文介绍了一个用于创建 UDP socket 的 C 语言函数 create_UDP_socket。该函数接收 IP 地址、端口和类型作为参数,并根据参数创建监听或发送类型的 UDP socket。文章详细展示了如何设置 socket 地址结构、创建 socket、设置选项以及进行 bind 或 connect 操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

create_UDP_socket(char *ip, int port, int type)
{
    struct sockaddr_in  addr;
    int sockfd;
    int on_off = 1;
    addr.sin_family = AF_INET;
    if (ip == NULL) {
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
    }
    else {
        addr.sin_addr.s_addr = inet_addr(ip);
    }

    addr.sin_port = htons(port);
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
        return(-1);
    }

    fcntl(sockfd, F_SETFD, FD_CLOEXEC);

    if(type == 0) {//listener
        setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR, (const void *)&on_off, sizeof(on_off));
        if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
            close(sockfd);
            return(-1);
        }
    }
    else {//sender
        if(connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
            close(sockfd);
            return(-1);
       }
   }
    return(sockfd);
}

 

以下是一个简单的封装UDP客户端的示例代码,你可以根据自己的需求进行修改: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define UDP_PORT 8888 #define SERVER_IP "127.0.0.1" int udp_client_init() { int sockfd; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { perror("socket"); return -1; } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(UDP_PORT); server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); return sockfd; } int udp_client_send(int sockfd, const char *buf, int len) { struct sockaddr_in server_addr; int ret; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(UDP_PORT); server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); ret = sendto(sockfd, buf, len, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)); if(ret < 0) { perror("sendto"); return -1; } return ret; } int udp_client_recv(int sockfd, char *buf, int len) { struct sockaddr_in server_addr; socklen_t addrlen = sizeof(server_addr); int ret; ret = recvfrom(sockfd, buf, len, 0, (struct sockaddr *)&server_addr, &addrlen); if(ret < 0) { perror("recvfrom"); return -1; } return ret; } int udp_client_close(int sockfd) { close(sockfd); } int main() { int sockfd; char buf[1024]; int ret; sockfd = udp_client_init(); if(sockfd < 0) { exit(1); } while(1) { printf("Please input your message:"); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = '\0'; ret = udp_client_send(sockfd, buf, strlen(buf)); if(ret < 0) { exit(1); } ret = udp_client_recv(sockfd, buf, sizeof(buf)); if(ret < 0) { exit(1); } buf[ret] = '\0'; printf("Server reply:%s\n", buf); } udp_client_close(sockfd); return 0; } ``` 在这个示例代码中,我们封装UDP客户端的初始化、发送消息、接收消息和关闭socket的函数,实现了对于UDP客户端的简单封装
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值