说明

系统:ubuntu 14.04

安装库

sudo apt-get install libev-dev

可以在/usr/include下找到ev.h。

服务器代码

server.c

#include

#include

#include

#define PORT_NO 3033

#define BUFFER_SIZE 1024

int total_clients = 0; // Total number of connected clients

void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);

void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);

int main()

{

struct ev_loop *loop = ev_default_loop(0);

int sd;

struct sockaddr_in addr;

int addr_len = sizeof(addr);

struct ev_io w_accept;

// Create server socket

if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )

{

perror("socket error");

return -1;

}

bzero(&addr, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_port = htons(PORT_NO);

addr.sin_addr.s_addr = INADDR_ANY;

// Bind socket to address

if (bind(sd, (struct sockaddr*) &addr, sizeof(addr)) != 0)

{

perror("bind error");

}

// Start listing on the socket, backlog is 2

if (listen(sd, 2) < 0)

{

perror("listen error");

return -1;

}

// Initialize and start a watcher to accepts client requests

ev_io_init(&w_accept, accept_cb, sd, EV_READ);

ev_io_start(loop, &w_accept);

// Start infinite loop

while (1)

{

//ev_loop(loop, 0);

ev_run(loop, 0);

}

return 0;

}

/* Accept client requests */

void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)

{

struct sockaddr_in client_addr;

socklen_t client_len = sizeof(client_addr);

int client_sd;

struct ev_io *w_client = (struct ev_io*) malloc (sizeof(struct ev_io));

if(EV_ERROR & revents)

{

perror("got invalid event");

return;

}

// Accept client request

client_sd = accept(watcher->fd, (struct sockaddr *)&client_addr, &client_len);

if (client_sd < 0)

{

perror("accept error");

return;

}

total_clients ++; // Increment total_clients count

printf("Successfully connected with client.\n");

printf("%d client(s) connected.\n", total_clients);

// Initialize and start watcher to read client requests

ev_io_init(w_client, read_cb, client_sd, EV_READ);

ev_io_start(loop, w_client);

}

/* Read client message */

void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents){

char buffer[BUFFER_SIZE];

ssize_t read;

if(EV_ERROR & revents)

{

perror("got invalid event");

return;

}

// Receive message from client socket

read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);

if(read < 0) // 出现错误

{

perror("read error");

return;

}

if(read == 0) // 有client关闭时

{

// Stop and free watchet if client socket is closing

ev_io_stop(loop,watcher);

free(watcher);

perror("peer might closing");

total_clients --; // Decrement total_clients count

printf("%d client(s) connected.\n", total_clients);

return;

}

else // 有数据到来

{

printf("message:%s\n",buffer);

}

// Send message bach to the client

send(watcher->fd, buffer, read, 0);

bzero(buffer, read);

}

当有客户端连接进来时,会调用accept_cb函数处理。当客户端有数据进来时,会调用read_cb来处理。

客户端代码

client.c

#include

#include

#define PORT_NO 3033

#define BUFFER_SIZE 1024

int main()

{

int sd;

struct sockaddr_in addr;

int addr_len = sizeof(addr);

char buffer[BUFFER_SIZE] = "";

// Create client socket

if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )

{

perror("socket error");

return -1;

}

bzero(&addr, sizeof(addr));

addr.sin_family = AF_INET;

addr.sin_port = htons(PORT_NO);

addr.sin_addr.s_addr = htonl(INADDR_ANY);

// Connect to server socket

if(connect(sd, (struct sockaddr *)&addr, sizeof addr) < 0)

{

perror("Connect error");

return -1;

}

while (strcmp(buffer, "q") != 0)

{

// Read input from user and send message to the server

gets(buffer);

send(sd, buffer, strlen(buffer), 0);

// Receive message from the server

recv(sd, buffer, BUFFER_SIZE, 0);

printf("message: %s\n", buffer);

}

return 0;

}

编译测试

gcc server.c -o server -lev

gcc client.c -o client

可以同时启动多个client。

Java nio libev,libev实现echo服务器相关推荐

  1. 并发型服务器响应方式,基于Java NIO 开发高性能并发型服务器程序的研究

    基于Java NIO 开发高性能并发型服务器程序的研究 第8卷%第5期 软件导刊 2009年5月SoftwareGuide Vol.8No.5May.2009 基于JavaNIO开发高性能并发型服务器 ...

  2. 基于 Java NIO 实现简单的 HTTP 服务器

    1.简介 本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理.本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 ...

  3. java nio ssl_java连接MQTT+SSL服务器

    java用ssl加密方式连接mqtt服务器.其它ssl加密的也可以参考,SSLSocketFactory获取部分都是一样的.踩了很多坑,根据生成工具不同(openssl和keytool)以及秘钥文件编 ...

  4. [c语言 ] 用libev 写个echo服务器

    放假了.同学都回家了,我是更情愿留久点在学校,一来学校安静,二来免得火车太挤.  这临走前的几天,放下了erlang,写了一下c. 其实只是对比下erlang 写socket服务器,和c写socket ...

  5. 【java】关于Java NIO的一切

    1.概述 概述:关于Java NIO的『一切』 建议看原文 太长了 本文译自Jakob Jenkov的Java NIO.注意,并非逐字翻译,删除了原文中碎碎念的部分,有些地方也加入了自己的理解. Ja ...

  6. 6.JAVA NIO 字符集

    第六章 字符集 我们生活在一个变化莫测的世界中.甚至在这个我们称之为地球的平凡的 M 级行星 上,我们也使用数百种不同的语言.在<The Hitchhikers Guide to the Gal ...

  7. 海纳百川而来的一篇相当全面的Java NIO教程

    目录 零.NIO包 一.Java NIO Channel通道 Channel的实现(Channel Implementations) Channel的基础示例(Basic Channel Exampl ...

  8. 使用 NIO 实现 echo 服务器

    NIO相关知识点 IO.NIO.AIO 内部原理分析 NIO 之 Selector实现原理 NIO 之 Channel实现原理 NIO 之 ByteBuffer实现原理 服务器使用NIO来实现一个ec ...

  9. Java NIO编写Socket服务器的一个例子

    最近一直在忙着JAVA NIO的知识,花了一下午的时间,总算写出了一个可以运行的程序,废话少说,上代码! Java代码: import java.io.IOException; import java ...

  10. java nio 强制关闭_Java NIO服务器:远程主机强迫关闭了一个现有的连接

    Java NIO聊天室 中,若客户端强制关闭,服务器会报"java.io.IOException: 远程主机强迫关闭了一个现有的连接.",并且服务器会在报错后停止运行,错误的意思就 ...

最新文章

  1. 【腾讯bugly干货分享】微信Android热补丁实践演进之路
  2. 别再被 Python 洗脑了!!
  3. 处理字符串_7_判断字符串是字符串数字型
  4. 在人山人海里,你不必记得我
  5. 【B/S】HTML总结
  6. kotlin使用mapstruct(二)
  7. 中国移动MM的免流量费策略太不靠谱
  8. 【NLP】自然语言处理技术在自动生成足球比赛战报上的应用
  9. 三菱FX系列PLC以太网连接组态王软件
  10. ffi一些常见的错误
  11. 淘宝客接入PHP(一)
  12. 简洁的微信Markdown编辑器
  13. 梳妆台行业调研报告 - 市场现状分析与发展前景预测
  14. KALI--入门教程--kali下载(vm),更新国内源,更换中文界面
  15. 前缀和【一维前缀和与二维前缀和】
  16. AttributeError: builtin_function_or_method object has no attribute mktime
  17. android widget动画,widget 动画 - androidCode的个人空间 - OSCHINA - 中文开源技术交流社区...
  18. 解决json_encode中文乱码情况
  19. 【报告分享】2021百度快消人群洞察-百度营销研究院(附下载)
  20. Unity 快速检测本机网络链接状态

热门文章

  1. encodeURI()函数和encodeURIComponent()函数
  2. 物联网最常见的5个核心关键技术与2种技术难点
  3. Eclipse java web在show view下没有server选项视图
  4. 解开人人网登录密码的 RSA 加密--转载
  5. 中职计算机基础微课,微课在中职“计算机应用基础”课程教学中的应用探讨_优秀论文...
  6. 改变输出的文字的字体格式
  7. win8激活及bootMGR is missing问题的解决
  8. FFmpegVideo DownloadHelper下载网页HLS流视频
  9. 苹果电脑的CCTV直播软件_我是亲民_新浪博客
  10. autoit对于web中flash控件的操作