libevent 实现的socket 通信 server以及解决找不到动态库的方法
注: client 个人觉得没必要用 libvent来实现就没写
注:由于 涉及到回调函数的使用 如有疑惑的可以先去了解回调函数的实现机理
先来说一下 libevent主要是干啥的 :
内部封装了 socket 通信 和 io 转接函数 ,通过使用大量的回调使得不用考虑大量重复的工作,并且其根据不同平台封装了不同的io转接函数,使其具有跨平台的效果(这里linux 封装的是epoll)
下面 直接上代码 :
// File Name: server.c
// Author: jiujue
// Created Time: 2019年03月29日 星期五 10时11分12秒 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
#include <unistd.h>
#include <arpa/inet.h> //read back call
void read_cb(struct bufferevent* bufev,void *ptr)
{
char buf[] = {};
int len = bufferevent_read(bufev,buf,sizeof(buf));
if(len == -)
{
perror("bufferevent_read error");
exit();
}
printf("receive info : %s\n ",buf);
sprintf(buf,"I have received it.\n");
bufferevent_write(bufev, buf, strlen(buf)+); }
//write back call
void write_cb(struct bufferevent* bufev,void *ptr)
{
printf("I sent it out.\n");
}
//event back call
void event_cb(struct bufferevent* bufev,short ev, void *ptr)
{
if(ev & BEV_EVENT_EOF)
{
printf("have clinet disconnect.\n");
}
if(ev & BEV_EVENT_TIMEOUT)
{
printf("happen timeout event , exit ....\n");
exit();
}
bufferevent_free(bufev);
}
//linsener back call
void listener_cb(struct evconnlistener *listener,evutil_socket_t fd, struct sockaddr* addr, int len ,void * ptr)
{ struct event_base *base = (struct event_base*)ptr;
struct bufferevent *bufev = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bufev,read_cb,write_cb,event_cb,NULL);
bufferevent_enable(bufev,EV_READ);
} int main(int argc, const char* argv[])
{
if(argc<)
{
printf("argument not enough\neg: ./app port");
exit();
}
//event handler frmate
struct event_base * base = event_base_new();
//server addr
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(atoi(argv[])); //bind listener accept
struct evconnlistener * listener = evconnlistener_new_bind(base,listener_cb,base,
LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -,
(struct sockaddr *)&server, sizeof(server)); //start event loop
event_base_dispatch(base); //collector garbage
event_base_free(base);
evconnlistener_free(listener); return ;
}
注:如果在libevent库使用的时候出现无法找到动态库的可以百度解决 ;这里提供一种方 分三步 1)找到 libevent.os.xxx 的位置 (一般在/usr/local/ 下 可以是用find命令找一下),2)将刚刚找到文件的绝对路径复制到 /etc/ld.so.conf 文件里 , 3)执行 ldconfig -v 命令可以看到这里刚那个复制的路径已经在里面了;这样就解决了
结语:有问题欢迎提在下方 ,本人在校学生,时间较为充裕, 有时间会回复的。
libevent 实现的socket 通信 server以及解决找不到动态库的方法的更多相关文章
- 解决Linux系统下程序找不到动态库的方法
思路:一般来说,通过make命令已经将程序依赖的动态库编译出来了,通过make install命令已经将动态库安装到系统的某个路径下.找没找到动态库就看这个路径是否包含在系统默认搜索动态库的路径中,如 ...
- [001]socket通信--server和client实现迭代的简单例子
server端: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unist ...
- [000]socket通信--server和client实现的简单例子
在C语言中就学过scanf和printf,其实理解socket就跟这两个输入输出差不多,只不过是信息的传输而已. 1.TCP服务器端(server)的默认函数调用顺序: 按照上述的调用顺序,我们可以来 ...
- Eclipse下把jar包放到工程lib下和通过buildpath加载有什么不同(解决找不到类的中级方法)
我通过Eclipse的 User Libranry 将jar导入 Eclipse里面,编译没有问题,运行的时候就报class文件没有定义,后来上网上查了下,原因找到啦,是这样的: 用Java Buil ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- day36——死锁、递归锁、信号量、GIL、多线程实现socket通信、线程池和进程池
day36 死锁现象与递归锁 死锁现象 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...
- Python socket 通信功能简介
常用的地址家族AF_UNIX:基于文件,实现同一主机不同进程之间的通信AF_INET:基于网络,适用于IPv4AF_INET6:基于网络,使用于IPv6 常见的连接类型SOCK_STREAM:即TCP ...
- java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)
原文链接: http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html 代码: http://files.cnblogs.com/k ...
- Unity3d socket通信 切换到web版本时报错SecurityException解决办法
原文地址:传送门 今天苦战了一天,就跟一个Unity切换到web平台的socket通信出错苦苦纠缠了一天,问了好多大牛,但他们的回复都是我没搞过web平台下的通信或者我只专研于pc或者移动平台.看来没 ...
随机推荐
- MySQL查看数据库安装路径
有时候在我们开发的过程中并不一定记得数据库的安装路径.比如要查看mysql 数据库的安装目录在哪里:我们可以通过mysql命令查看mysql的安装路径: # 以下两个sql任意一个可查询 select ...
- Center a website:网页居中
inside the <body> tags, using a "wrapper" div to control the whole section. HTML: &l ...
- Windows 下安装RabbitMQ服务器及基本配置
RabbitMQ是一个在AMQP协议标准基础上完整的,可复用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...
- RxJava操作符的简单使用
一.准备工作在app的build.gradle文件下的dependencies中添加依赖: compile 'io.reactivex:rxjava:1.3.0' compile 'io.reacti ...
- Android调试神器stetho使用详解和改造
本文由云+社区发表 作者:NaOH 概述 stetho是Facebook开源的一个Android调试工具,项目地址:facebook/stetho 通过Stetho,开发者可以使用chrome的ins ...
- Api管家系列(二):编辑和继承Class
上篇写了个大概,今天我详细说一下参数的编辑,废话不多说 先打开一个项目,我要特别说一下设置里的“默认参数设置” 打开默认参数设置,这里我用红色圈出的tab可以设置请求头,返回头和返回状态,这些设置会在 ...
- DataPipeline | PayPal庞姬桦:大数据在小微企业贷款上的运用
庞姬桦女士毕业于北京大学和美国哥伦比亚大学,目前担任PayPal公司消费者风险管理总监,负责通过大数据实现对互联网金融风险的侦测.跟踪.管控和防范.在加入PayPal之前,曾任职于渣打银行(中国)和美 ...
- ng6.1 新特性:滚回到之前的位置
在之前的版本中滚动条位置是一个大问题,主要表现在 1. 使用快捷键或者手势前进/后退的时候,滚动条的位置经常是错乱的,所以只能每个页面都要重置一个滚动条的位置: 2. #anchor1 锚点位置无法定 ...
- 【视频】Entity Framework Core 2.* 入门教程
视频专辑在B站上:https://www.bilibili.com/video/av34462368/ 内容暂时如下,还在更新中: 1. 简介 & 创建Model,生成数据库 2. 在ASP. ...
- 【Netty】(7)---搭建websocket服务器
[Netty](7)---搭建websocket服务器 说明:本篇博客是基于学习某网有关视频教学. 目的:创建一个websocket服务器,获取客户端传来的数据,同时向客户端发送数据 一.服务端 1. ...