Libevent示例程序5 echo服务器
来源:互联网 发布:手机淘宝如何改名字 编辑:程序博客网 时间:2024/06/10 03:16
//服务器代码//echoServer.c#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <assert.h> #include <event2/event.h>#include <event2/bufferevent.h> const int LISTEN_PORT = 9999;const int LISTEN_BACKLOG = 32; void do_accept(evutil_socket_t listener, short event, void *arg);void read_cb(struct bufferevent *bev, void *arg);void error_cb(struct bufferevent *bev, short event, void *arg);void write_cb(struct bufferevent *bev, void *arg); int main(int argc, char *argv[]){ evutil_socket_t listener; struct sockaddr_in sin; listener = socket(AF_INET, SOCK_STREAM, 0); assert(listener > 0); evutil_make_listen_socket_reuseable(listener); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(LISTEN_PORT); if(bind(listener, (struct sockaddr*)&sin, sizeof(sin)) < 0) { perror("listen"); return 1; } if (listen(listener, LISTEN_BACKLOG) < 0) { perror("listen"); return 1; } printf ("Listening...\n"); evutil_make_socket_nonblocking(listener); struct event_base *main_base = event_base_new(); assert(main_base != NULL); struct event *listen_event = NULL; listen_event = event_new(main_base, listener, EV_READ|EV_PERSIST, do_accept, (void*)main_base); event_add(listen_event, NULL); event_base_dispatch(main_base); return 0;} void do_accept(evutil_socket_t listener, short event, void *arg){ struct event_base *base = (struct event_base*)arg; evutil_socket_t connfd; struct sockaddr_in sin; socklen_t slen = sizeof(struct sockaddr_in); connfd = accept(listener, (struct sockaddr *)&sin, &slen); if(connfd < 0) { perror("accept"); return; } if(connfd > FD_SETSIZE) { perror("connfd > FD_SETSIZE"); return; } struct bufferevent *bev = bufferevent_socket_new(base, connfd, BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev, read_cb, NULL, error_cb, arg); bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);} void read_cb(struct bufferevent *bev, void *arg){ const int MAX_LINE = 255; char line[MAX_LINE + 1]; int n; while(n = bufferevent_read(bev, line, MAX_LINE), n > 0) { line[n] = '\0'; bufferevent_write(bev, line, n); printf("%s\n",line); } } void write_cb(struct bufferevent *bev, void *arg){} void error_cb(struct bufferevent *bev, short event, void *arg){ bufferevent_free(bev);}
//客户端代码//echoclient.c#include<stdio.h>#include<string.h> #include<sys/socket.h> #include<arpa/inet.h> int main(int argc , char *argv[]){ int sock; struct sockaddr_in server; char message[1000] , server_reply[2000]; sock = socket(AF_INET , SOCK_STREAM , 0); if (sock == -1) { printf("Could not create socket"); } server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons(9999); if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) { perror("connect failed. Error"); return 1; } printf("Connected\n"); while(1) { printf("Enter message : "); scanf("%s" , message); //Send some data if( send(sock , message , strlen(message) , 0) < 0) { perror("Send failed"); return 1; } //Receive a reply from the server memset(server_reply, 0, sizeof(server_reply)); if( recv(sock , server_reply , 2000 , 0) < 0) { perror("recv failed"); break; } printf("Server reply :\n%s\n", server_reply); } close(sock); return 0;}
from http://www.cnblogs.com/yemsheng/archive/2013/04/16/3023265.html
参考
http://www.felix021.com/blog/read.php?2068
http://www.binarytides.com/server-client-example-c-sockets-linux/
http://www.cppblog.com/lk624424108/articles/162909.html
0 0
- Libevent示例程序5 echo服务器
- libevent简单echo示例
- libevent编写echo服务器
- libevent echo服务端程序
- Libevent示例程序1
- 另一个用libevent实现的echo服务器
- 网络编程----libevent改造Echo服务器
- 基于libevent的服务器示例
- Libevent示例程序4 信号量
- libevent 的bufferevent和evconnlistener用法(echo示例)
- 简单的echo服务器程序
- Libevent示例程序2 socket程序
- Libevent示例程序3 定时器程序
- Libevent示例程序3 定时器程序续
- CSAPP echo 客户端和服务器的示例
- Libevent示例程序6 io事件
- Libevent示例程序7 bufferevent使用
- 使用libevent:echo server
- Android开发相关工具
- Java学习总结14——JDBC详解
- java 用文件对话框打开文件
- 学习笔记之二叉树的构建
- 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错 - 细雨淅淅
- Libevent示例程序5 echo服务器
- LeetCode 125 Valid Palindrome
- [GUIDE]How To Port Different ROMS to Your Device (Simplest and Fastest)
- 手动下载插件
- 《Programming in Lua 3》读书笔记(四)
- POJ 2528 Mayor's posters 线段树
- How to port manufacturer ROM
- 【LeetCode】Set Matrix Zeroes
- 【XGT教程】【原创】Windows环境下解包打包自定义内核im ...