注: 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以及解决找不到动态库的方法的更多相关文章

  1. 解决Linux系统下程序找不到动态库的方法

    思路:一般来说,通过make命令已经将程序依赖的动态库编译出来了,通过make install命令已经将动态库安装到系统的某个路径下.找没找到动态库就看这个路径是否包含在系统默认搜索动态库的路径中,如 ...

  2. [001]socket通信--server和client实现迭代的简单例子

    server端: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unist ...

  3. [000]socket通信--server和client实现的简单例子

    在C语言中就学过scanf和printf,其实理解socket就跟这两个输入输出差不多,只不过是信息的传输而已. 1.TCP服务器端(server)的默认函数调用顺序: 按照上述的调用顺序,我们可以来 ...

  4. Eclipse下把jar包放到工程lib下和通过buildpath加载有什么不同(解决找不到类的中级方法)

    我通过Eclipse的 User Libranry 将jar导入 Eclipse里面,编译没有问题,运行的时候就报class文件没有定义,后来上网上查了下,原因找到啦,是这样的: 用Java Buil ...

  5. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  6. day36——死锁、递归锁、信号量、GIL、多线程实现socket通信、线程池和进程池

    day36 死锁现象与递归锁 死锁现象 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...

  7. Python socket 通信功能简介

    常用的地址家族AF_UNIX:基于文件,实现同一主机不同进程之间的通信AF_INET:基于网络,适用于IPv4AF_INET6:基于网络,使用于IPv6 常见的连接类型SOCK_STREAM:即TCP ...

  8. 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 ...

  9. Unity3d socket通信 切换到web版本时报错SecurityException解决办法

    原文地址:传送门 今天苦战了一天,就跟一个Unity切换到web平台的socket通信出错苦苦纠缠了一天,问了好多大牛,但他们的回复都是我没搞过web平台下的通信或者我只专研于pc或者移动平台.看来没 ...

随机推荐

  1. 第一册:lesson1-2.

    原文: lesson 1 Excuse me! Excuse me! Yes? Is this your handbag? Pardon? Is this your handbag? Yes it i ...

  2. Python基础 列表介绍、使用

    第3章 学习目标: 列表是什么以及如何使用列表元素.列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素.列表是新手可直接使用的最强大的Python功能之一,它融合了众 ...

  3. 看一眼就学会的 HTML 小游戏搭建!

    本文作者:CODING 用户 - xfly 身边经常会有小伙伴问我有没有办法不买服务器也能上线自己的个人项目,比如不少同学都非常喜欢搭建一个属于自己的博客站点或者小游戏等. 目前相对比较简便的且不花自 ...

  4. postgreSQL 玩转josnb (长期更新)

    json和jsonb的操作符 jsonb额外操作符 json创建函数 json处理函数 函数 返回类型 描述 示例 结果 json_array_length(json) jsonb_array_len ...

  5. dotnet中Stream、string及byte[]的相关操作

    string与byte[](UTF-8) //string to byte[] string str = "abc中文"; //0x61 0x62 0x63 0xE4 0xB8 0 ...

  6. FFmpeg命令行工具学习(五):FFmpeg 调整音视频播放速度

    FFmpeg对音频.视频播放速度的调整的原理不一样.下面简单的说一下各自的原理及实现方式: 一.调整视频速率 调整视频速率的原理为:修改视频的pts,dts 实现: ffmpeg -i input.m ...

  7. ABP学习笔记总汇

    首先立下一个目标,未来一段时间开始学习ABP. 先立一个flag.之后会再次更新目录和文章连接 目录 1.ABP学习笔记(1)-使用mysql

  8. python的进程与线程(二)

    线程 之前了解了操作系统的发展史,也知道了进程和线程的概念,归纳一下就是:         进程:本质上就是一段程序的运行过程(抽象的概念)         线程:最小的执行单元,是进程的实体     ...

  9. Mybatis之旅第二篇-Mapper动态代理方式

    一.引言 通过上一篇mybatis的入门学习,我们已经会使用mybatis实现简单的增删改查,但是我们也发现了用原始Dao开发的一些问题: Dao方法体存在重复代码:通过SqlSessionFacto ...

  10. 『集群』004 Slithice 集群分布式(多个客户端,基于中央服务器的集群服务)

    Slithice 集群分布式(多个客户端,基于中央服务器的多个集群服务端) 案例Demo展示: 集群架构图 如下: 如上图,上图 展示了 这个集群 的 结构: >一个中央服务器(可以有多个),负 ...