一个简单的基于epoll的udp接收
---
1 #include <iostream>
2 #include <sys/epoll.h>
3 #include <fcntl.h>
4 #include <thread>
5 #include <chrono>
6 #include <pthread.h>
7 #include <sys/socket.h>
8 #include <arpa/inet.h>
9 #include <netinet/in.h>
10 #include <sys/time.h>
11 #include <sys/select.h>
12 #include <unistd.h>
13 #include <string.h>
14
15 #include <errno.h>
16
17
18 using namespace std;
19
20 int main(int argc, char *argv[])
21 {
22
23 int udpfd = 0;
24 char arr_ip4_local[] = {"192.168.244.128"};
25 char arr_ip4_dst[] = {"10.1.1.5"};
26
27
28 struct sockaddr_in addr_dst;
29 struct sockaddr_in addr_local;
30 bzero(&addr_dst, sizeof(struct sockaddr_in));
31 bzero(&addr_local, sizeof(struct sockaddr_in));
32
33 addr_dst.sin_port = htons(12345);
34 addr_dst.sin_family = AF_INET;
35 // addr_dst.sin_addr.s_addr = htonl(INADDR_ANY);
36 inet_pton(AF_INET, arr_ip4_dst, &addr_dst.sin_addr.s_addr);
37
38 addr_local.sin_family = AF_INET;
39 addr_local.sin_port = htons(12345);
40 //inet_pton(AF_INET, arr_ip4_local, &addr_local.sin_addr.s_addr);
41 addr_local.sin_addr.s_addr = htonl(INADDR_ANY);
42
43 // socket
44 udpfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
45 if (0 > udpfd)
46 {
47 std::cout << "created failed\n";
48 return 0;
49 }
50
51
52 // bind local address to recv and send data
53 int ret_val = bind(udpfd, (struct sockaddr*)&addr_local, sizeof(addr_local));
54 if (0 != ret_val)
55 {
56 std::cout << "bind error, id = " << errno << "\n";
57 close(udpfd);
58 return 0;
59 }
60
61
62 // epoll operation
63 struct epoll_event event;
64 struct epoll_event event_wait;
65
66 int epoll_fd = epoll_create(10);
67 if ( -1 == epoll_fd )
68 {
69 std::cout << "epoll_create error, id = " << errno << "\n";
70 close(udpfd);
71 return 0;
72 }
73
74 //
75 event.data.fd = 0;
76 event.events = EPOLLIN;
77
78 // register functions
79 ret_val = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &event);
80 if ( -1 == ret_val )
81 {
82 std::cout << "epoll_ctl error, id = " << errno << "\n";
83 close(udpfd);
84
85 return 0;
86 }
87
88 //
89 event.data.fd = udpfd;
90 event.events = EPOLLIN;
91 ret_val = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, udpfd, &event);
92 if ( -1 == ret_val )
93 {
94 std::cout << "epoll_ctl error, udpfd, id = " << errno << "\n";
95 close(udpfd);
96
97 return 0;
98 }
99
100 // listen
101 struct sockaddr_in addr_recv;
102 char arr_recv[1024] = {0};
103 int addr_recv_len = sizeof(addr_recv);
104 bzero(&addr_recv, addr_recv_len);
105 socklen_t recv_len = sizeof(addr_recv);
106
107 int quit_index = 1;
108 int quit_count = 10;
109
110
111 while (1)
112 {
113 std::cout << "wait for connecting: ";
114 ret_val = epoll_wait(epoll_fd, &event_wait, 2, -1);
115 if (-1 == ret_val)
116 {
117 std::cout << "error, while, id = " << errno << "\n";
118 close(udpfd);
119 return 0;
120 }
121
122 else if (0 < ret_val)
123 {
124 if ( (udpfd == event_wait.data.fd)
125 &&
126 (EPOLLIN == (event_wait.events & EPOLLIN)) )
127 {
128 ret_val = recvfrom(udpfd, arr_recv, 1024, 0, (struct sockaddr*)&addr_recv, &recv_len);
129 std::cout << "\n recvfrom = " << ret_val << "\n";
130 bzero(&addr_recv, addr_recv_len);
131 quit_index ++;
132 if ( quit_index >= quit_count )
133 break;
134 }
135
136 }
137 else if (0 == ret_val)
138 {
139 std::cout << "\nwhile timeout\n";
140 }
141 else
142 {
143
144 }
145 }
146
147 close(udpfd);
148
149 return 0;
150 }
----
一个简单的基于epoll的udp接收的更多相关文章
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统
本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享
今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...
- struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...
- 一个简单的基于 DirectShow 的播放器 2(对话框类)
上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器 1(封装类) 本文继续上篇文章,分析一下调用这个封装类(CDXGrap ...
- 一个简单的基于 DirectShow 的播放器 1(封装类)
DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...
- 构建一个简单的基于MVC模式的JavaWeb
零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...
随机推荐
- PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台
ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...
- python函数初体验
函数 函数参数w 形式参数>>>>(被指定具体的值)默认参数, 实际参数是调用时候的实际指定参数 我们把函数⾥⾯的参数叫形式函数,函数实际调⽤的时候,赋予的参数叫实际函数 定义 ...
- 虚拟节点轻松应对 LOL S11 百万并发流量——腾竞体育的弹性容器实践
作者 刘如梦,腾竞体育研发工程师,擅长高并发.微服务治理.DevOps,主要负责电竞服务平台架构设计和基础设施建设. 詹雪娇,腾讯云弹性容器服务EKS产品经理,主要负责 EKS 虚拟节点.容器实例相关 ...
- 日常Java 2021/9/20
Java随机数 运用Java的random函数实现猜数字游戏 随机产生一个1-50之间的数字,然后让玩家猜数,猜大猜小都给出提示,猜对后游戏停止 package pingchangceshi; imp ...
- C/C++ Qt 数据库与ComBox多级联动
Qt中的SQL数据库组件可以与ComBox组件形成多级联动效果,在日常开发中多级联动效果应用非常广泛,例如当我们选择指定用户时,我们让其在另一个ComBox组件中列举出该用户所维护的主机列表,又或者当 ...
- 入坑不亏!我们最终决定将 70w+ 核心代码全部开源
作者 | 一啸 来源 | 尔达 Erda 公众号 背景故事 2017 年初,我们基于 DC/OS (mesos + marathon) 开始构建端点自己的 PaaS 平台,核心任务就是解决公司的软件开 ...
- 零基础学习java------day7------面向对象
1. 面向对象 1.1 概述 面向过程:c语言 面向对象:java :python:C++等等 面向对象的概念: (万物皆对象)------think in java everything in ...
- 软件测试人员必备的linux命令
1 目录与文件操作1.1 ls(初级)使用权限:所有人功能 : 显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录). 参数 : -a 显示所有档案及目录 (ls内定将档案名或目录名称开头为 ...
- Copy elision in C++
Copy elision (or Copy omission) is a compiler optimization technique that avoids unnecessary copying ...
- Spring组合注解与元注解
目录 注解说明 源代码 使用范例 注解说明 元注解:可以注解到别的注解上的注解,所以元注解首先基于条件@Target({ElementType.TYPE}) ,目标使用在类文件上 . 组合注解:连个元 ...