linux下使用最小化c代码实现udp传输

发送
  • 声明、初始化 sockaddr_in
struct sockaddr_in servaddr;

// initialize addr
memset(&servaddr, 0, sizeof(servaddr));
  • 配置addr,告诉它你要发往哪里
// socket configuration
servaddr.sin_addr.s_addr = inet_addr(ip);
servaddr.sin_port = htons(port);
servaddr.sin_family = AF_INET;
  • 创建socket
// create socket
sock = socket(AF_INET, SOCK_DGRAM, 0);  // UDP
if (-1 == sock) {
    return false;
    puts("Failed to create socket");
}
  • 使用sendto()发送
ssize_t send_size =sendto(sock, packet, packet_size, 0, 		(const struct sockaddr*)&servaddr,sizeof(servaddr));
  • 关闭socket
// close the socket
close(sock);
接收(epoll)
  • 创建epoll
int eq = epoll_create(1024);
  • 创建并初始化socket fd
int fd = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
address.sin_port = htons(port);

if (bind(fd, (sockaddr*)&address, sizeof(sockaddr)) != 0) {
    printf("bind failed, errno is %d\n", errno);
    return -1;
}
  • 初始化epoll_event,添加对应的socket_fd,如果想监听多个端口,可创建多个fd,使用epoll_ctl将fd逐一加入到event
struct epoll_event evt = {0, {0}};
evt.events = EPOLLIN;
evt.data.fd = fd;

if (epoll_ctl(eq, EPOLL_CTL_ADD, fd, &evt) != 0) {
    return -1;
}
  • 创建用于接收event的数组
epoll_event active_querys[1024];
  • 开始无限循环
  • 进入阻塞,等待消息传入,当有数据包到达时被唤醒,count为数据包数量
int count = epoll_wait(eq, active_querys, 1024, -1);
  • 根据count数量进行相应次数的处理。其中active_querys前count位就是有新数据包到达的socket对应的event
for (int i = 0; i < count; i++) {
    epoll_event evt = active_querys[i];

    if (evt.data.fd == fd) {
        char buf[1024] = {0};
        // 从fd接收数据
        ssize_t size = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
        if (size == -1) {
            printf("recvfrom failed, errno is %d\n", errno);
        }
        // 处理buff
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值