注: 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. Vscode新建html文件

    在Vscode新建html文件 1.点击Open Folder: 2.选择目标文件夹,新建一个拓展名为html的文件: 3.在第1行输入!(英文状态下),按tab键,新建成功.界面如下图所示:

  2. Java关于数字工具类~持续汇总~

    /** * 01 * 描述:求int数组中最大值 * [时间 2019年3月5日下午3:21:36 作者 陶攀峰] */ public static int test01(int[]sz) { int ...

  3. Spring Aop源码分析

    最近看了SpringAop的源码实现  大概记录一下aop的源码流程 创建一个最简单的一个测试类 package com.zcg.learn.Test; import org.aopalliance. ...

  4. gin+gorm

    在[环境变量]中添加如下[用户变量]/[系统变量]:GO111MODULE,值为on go mod init目录 在项目中新建文件main.go,并添加测试代码 package main import ...

  5. javascript面向对象理解的补充

    <html> <head> <title>js inherit demo</title> <meta http-equiv="pragm ...

  6. 微信小程序页面跳转方法和携带参数详解

    1.页面跳转方式     (1)标签跳转   open-type的属性值对应api里的用法即wx.的用法   1 <navigator url="/page/navigate/navi ...

  7. vue2.0 日历日程表 ,可进行二次开发.

    由于工作业务需求,要写一个日程表,日程表写之前 要先生成日历,废话不多说,直接 上代码: <!DOCTYPE html> <html lang="zh-CN"&g ...

  8. 零基础如何自学java开发?

    开篇直奔主题,java 学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习. 有人指导:第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人.先介绍下我 ...

  9. java EE中的hello1.java及Annotation(注解)

    一.Annotation(注解) 注解(Annotation)很重要,未来的开发模式都需要注解,注解是java.lang.annotation包,Annotation是从java5引入的,它提供一些不 ...

  10. Android进阶之光-第1章-Android新特性-读书笔记

    第 1 章 Android 新特性 1.1 Android 5.0 新特性 1.1.1 Android 5.0 主要新特性 1. 全新的 Material Design 新风格 Material De ...