skynet网络库socket-server
最近在读大神云风的开源服务器架构skynet,其中的网络库,云风已经单独开来,可以独立使用。
开源地址:
https://github.com/cloudwu/socket-server
网络库已经封装了socket的epoll.
在下载起来的世里面,已经包含了一个例子,但觉得不够明了。于是自己写了个测试例子,分为服务端了客户端,服务端启动并监听端口,客户端启动并连接服务器,向服务器发送消息,并得到服务器的反馈。
服务端代码:
#include "socket_server.h" #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h> static void *
_poll(void * ud) {
struct socket_server *ss = ud;
struct socket_message result;
for (;;) {
int type = socket_server_poll(ss, &result, NULL);
// DO NOT use any ctrl command (socket_server_close , etc. ) in this thread.
switch (type) {
case SOCKET_EXIT:
return NULL;
case SOCKET_DATA:
printf("message(%lu) [id=%d] size=%d %s\n",result.opaque,result.id, result.ud, result.data);
// free(result.data);
socket_server_send(ss, result.id, result.data, result.ud) ;
break;
case SOCKET_CLOSE:
printf("close(%lu) [id=%d]\n",result.opaque,result.id);
break;
case SOCKET_OPEN:
printf("open(%lu) [id=%d] %s\n",result.opaque,result.id,result.data);
break;
case SOCKET_ERROR:
printf("error(%lu) [id=%d]\n",result.opaque,result.id);
break;
case SOCKET_ACCEPT:
printf("accept(%lu) [id=%d %s] from [%d]\n",result.opaque, result.ud, result.data, result.id);
socket_server_start(ss,,result.ud);
break;
}
}
} static void
test(struct socket_server *ss) {
pthread_t pid;
pthread_create(&pid, NULL, _poll, ss); // int c = socket_server_connect(ss,100,"127.0.0.1",80);
// printf("connecting %d\n",c);
int l = socket_server_listen(ss,,"127.0.0.1",,);
printf("listening %d\n",l);
socket_server_start(ss,,l);
// int b = socket_server_bind(ss,300,1);
// printf("binding stdin %d\n",b);
// int i;
// for (i=0;i<100;i++) {
// socket_server_connect(ss, 400+i, "127.0.0.1", 8888);
// }
// sleep(5);
// socket_server_exit(ss); pthread_join(pid, NULL);
} int
main() {
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sa, ); struct socket_server * ss = socket_server_create();
test(ss);
// socket_server_release(ss); return ;
}
客户端代码:
#include "socket_server.h" #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h> static void *
_poll(void * ud) {
struct socket_server *ss = ud;
struct socket_message result;
for (;;) {
int type = socket_server_poll(ss, &result, NULL);
// DO NOT use any ctrl command (socket_server_close , etc. ) in this thread.
switch (type) {
case SOCKET_EXIT:
return NULL;
case SOCKET_DATA:
printf("message(%lu) [id=%d] size=%d %s\n",result.opaque,result.id, result.ud, result.data);
free(result.data);
break;
case SOCKET_CLOSE:
printf("close(%lu) [id=%d]\n",result.opaque,result.id);
break;
case SOCKET_OPEN:
printf("open(%lu) [id=%d] %s\n",result.opaque,result.id,result.data);
break;
case SOCKET_ERROR:
printf("error(%lu) [id=%d]\n",result.opaque,result.id);
break;
case SOCKET_ACCEPT:
printf("accept(%lu) [id=%d %s] from [%d]\n",result.opaque, result.ud, result.data, result.id);
break;
}
}
} int
main() {
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sa, ); struct socket_server * ss = socket_server_create();
pthread_t pid;
pthread_create(&pid, NULL, _poll, ss); int c = socket_server_connect(ss,,"127.0.0.1",);
printf("connecting %d\n",c);
char buff[];
while(fgets(buff, sizeof(buff), stdin) != NULL)
{
buff[strlen(buff)-] = '\n';
char* sendBuf = malloc(strlen(buff) + );
memcpy(sendBuf, buff, strlen(buff));
socket_server_send(ss, c, sendBuf, strlen(sendBuf));
} pthread_join(pid, NULL);
socket_server_release(ss); return ;
}
skynet网络库socket-server的更多相关文章
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- go网络库cellent实现socket聊天功能
一 .介绍 cellnet是一个组件化.高扩展性.高性能的开源服务器网络库 git地址:https://github.com/davyxu/cellnet 主要使用领域: 游戏服务器 方便定制私有协议 ...
- 使用NewLife网络库构建可靠的自动售货机Socket服务端(一)
最近有个基于tcp socket 协议和设备交互需求,想到了新生命团队的各种组件,所以决定用NewLife网络库作为服务端来完成一系列的信息交互. 第一,首先说一下我们需要实现的功能需求吧 1,首先客 ...
- 跨平台高效率Lua网络库 ( 同步形式的API ,底层是异步非阻塞)
Joynet 项目地址:https://github.com/IronsDu/Joynet 介绍 high performance network library for lua, based on ...
- poco网络库分析,教你如何学习使用开源库
Poco::Net库中有 FTPClient HTML HTTP HTTPClient HTTPServer ICMP Logging Mail Messages NetCore NTP OAuth ...
- boost.ASIO-可能是下一代C++标准的网络库
曾几何时,Boost中有一个Socket库,但后来没有了下文,C++社区一直在翘首盼望一个标准网络库的出现,网络上开源的网络库也有不少,例如Apache Portable Runtime就是比较著名的 ...
- 公布一个基于 Reactor 模式的 C++ 网络库
公布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...
- python --- 网络编程Socket
网络编程 定义:所为网络编程即是对信息的发送和接收. 主要工作: (1)发送端:将信息以规定的协议组装成数据包. (2)接收端:对收到的数据包解析,以提取所需要的信息. Socket:两个在网络上的程 ...
- 轻量级网络库libevent概况
Libevent is a library for writing fast portable nonblocking IO. libevent是一个为编写快速可移植的非阻塞IO程序而设计的. lib ...
随机推荐
- 再探CRC
之前写了CRC16的程序,虽说能用,却不知其所心然,现在要用CRC32,重温一遍,一下就通了.笔记如下 CRC我没记错的话是Cyclic Redundancy Code,Cyclic和Redundan ...
- ASPX在Debug模式下直接link原始CSS而非Bundle后的CSS
由于对CSS做了bundle, debug的时候修改原始css文件不会直接反映到浏览器中, 效率较低. 于是我想在debug的时候直接link原始CSS. 很简单. <% #if DEBUG % ...
- 4.android.mk编写规范
Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握jni,就必须熟练掌握Andr ...
- Web安全测试之XSS(转)
XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞.指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的 ...
- java 正则表达式去除标点符号
public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV ...
- 监控Tomcat并启动
#!/bin/sh export _JAVA_SR_SIGNUM= export JAVA_HOME=/usr/java/jdk1..0_11 export CATALINA_BASE=/home/c ...
- asp.net 服务器端缓存与客户端缓存 [转]
介绍: 在我解释cache管理机制时,首先让我阐明下一个观念:IE下面的数据管理.每个人都会用不同的方法去解决如何在IE在管理数据.有的会提到用状态管 理,有的提到的cache管理,这里我比较喜欢ca ...
- Normal Vector Using WorldInverseTranspose
shader里面经常看到normal向量是用WorldInverseTranspose矩阵做变换的,有时候也可以用WorldMatrix变换. 原理: If your object is only e ...
- 解决IE6浏览器下position:fixed固定定位问题
像你所遇到的问题一样, IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法.如果我们需要做某个元素始终位于浏览器的底部, ...
- PC-全国的 DNS服务商
我们请选第2个.然后根据自己的省市来填写..我复制了下版主给的网站 北京:202.96.199.133 202.96.0.133 202.106.0.20 202.106.148.1 202.97.1 ...