并发服务器的第二种实现方法:I/O复用

服务器端:

#include <arpa/inet.h>
#include <unistd.h>
#include <algorithm>
#include <stdio.h>
#include <cstring>
using namespace std;
char buf[];
int main(int argc, char **argv)
{
int ser_sock, cli_sock;
sockaddr_in ser_addr, cli_addr;
ser_sock = socket(PF_INET, SOCK_STREAM, );
if(ser_sock == -) puts("socket error"); int opt = ;
setsockopt(ser_sock, SOL_SOCKET, SO_REUSEADDR, &opt, ); memset(&ser_addr, , sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ser_addr.sin_port = htons(atoi(argv[]));
if(bind(ser_sock, (sockaddr *)&ser_addr, sizeof(ser_addr)) == -)
puts("bind error"); if(listen(ser_sock, ) == -) puts("listen error"); fd_set fd, copy_fd;
FD_ZERO(&fd);
FD_SET(ser_sock, &fd);
int fd_max = ser_sock;
timeval timeout;
socklen_t s_len = sizeof(cli_addr);
while()
{
timeout.tv_sec = ;
timeout.tv_usec = ;
copy_fd = fd;
int fd_num = select(fd_max+, &copy_fd, , , &timeout);
if(fd_num == ) continue;
for(int i = ; i <= fd_max; i++)
{
if(FD_ISSET(i, &copy_fd))
{
if(i == ser_sock)//accept时服务器套接字发生变化
{
cli_sock = accept(ser_sock, (sockaddr *)&cli_addr, &s_len);
FD_SET(cli_sock, &fd);
fd_max = max(fd_max, cli_sock);
}
else //传输数据时客户端套接字发生变化
{
int len = read(i, buf, );
if(!len) //eof时删除fd数组信息并关闭套接字
{
close(i);
FD_CLR(i, &fd);
printf("close client %d\n", i);
}
else
{
buf[len] = ;
printf("message form client %d : %s\n", i, buf);
write(i, buf, );
}
}
}
}
}
close(ser_sock);
return ;
}

客户端:

#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <algorithm>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
int sock;
sock = socket(PF_INET, SOCK_STREAM, );
sockaddr_in addr;
memset(&addr, , sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(argv[]);
addr.sin_port = htons(atoi(argv[]));
connect(sock, (sockaddr *)&addr, sizeof(addr));
char buf[];
while()
{
scanf("%s", buf);
int l = strlen(buf);
if(strcmp(buf, "q") == ) break;
write(sock, buf, l);
sleep(0.5);
int len = read(sock, buf, );
buf[len] = ;
printf("message from server : %s\n", buf);
}
close(sock);
return ;
}

I/O复用服务器端+回声客户端的更多相关文章

  1. 【转】Android Https服务器端和客户端简单实例

    转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...

  2. 【知识积累】服务器端获取客户端的IP地址(当客户端调用由Axis开发的WebService)

    一.前言 由于项目中一个小的模块需要获取客户端的IP地址以保证安全调用webservice接口,项目中客户端使用C#编写,服务器端使用Java编写,服务器端与客户端采用Axis开发的WebServic ...

  3. 实现服务器端与客户端的高频实时通信 SignalR(2)

    说明:本篇文章与上篇文章 实现服务器端与客户端的实时通信 SignalR(1) 基本代码类似,只是做了些处理 高频 的改动. 一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) ...

  4. pushlet实现服务器端向客户端推送信息

    使用Pushlet来实现服务器端向客户端推送信息 1.   实现方式: 有两种实现方式: 1.         通过配置文件来实现定时的从服务器端向客户端推送信息 2.         通过API主动 ...

  5. net remoting 服务器端订阅客户端(附源代码)

    remoting 在分布式应用中逐渐在企业级应用发展开来,最初提出分布式应用,主要目的是为了降低服务器的压力,将耗性能的处理放在另外一个程序中,然后将计算结果发送到另外一个应用中.而remoting就 ...

  6. gridview checkbox从服务器端和客户端两个方面实现全选和反选

    GridView中的checkbox的全选和反选在很多的地方都是要求实现的,所以下面就从服务器端和客户端两个方面实现了checkbox的选择,感兴趣的朋友可以了解下,希望本文对你有所帮助 GridVi ...

  7. 使用Pushlet来实现服务器端向客户端推送信息

        使用Pushlet来实现服务器端向客户端推送信息 1.   实现方式: 有两种实现方式: 1.         通过配置文件来实现定时的从服务器端向客户端推送信息 2.         通过A ...

  8. java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

    java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...

  9. python服务器端、客户端的模型,客服端发送请求,服务端进行响应(web.py)

    服务器端.客户端的模型,客服端发送的请求,服务端的响应 相当于启动了一个web server install web.py 接口框架用到的包 http://webpy.org/tutorial3.zh ...

随机推荐

  1. android 列表图片优化经历

    先上个优化之后的fps图,丝滑流畅:具体实现请看最终优化后的app 背景:一个通讯录app(开源地址),每次登陆时,针对每个用户,如果头像图片不在本地,则生成一个异步下载任务(AsyncTask). ...

  2. Salesforce中通过SOAP API和Metadata API开发java的web server服务

    1.下载Salesforce平台中WSDL文件 在Salesforce中创建了自己需要用到的对象后,我们想要在别的应用中读写纪录到对象中,首先需要的是自己Salesforce平台的权限通过.登陆自己的 ...

  3. ImageNet历年冠军和相关CNN模型

    ImageNet 是一个超过15 million的图像数据集,大约有22,000类. 是由李飞飞团队从2007年开始,耗费大量人力,通过各种方式(网络抓取,人工标注,亚马逊众包平台)收集制作而成,它作 ...

  4. 什么是HotSpot VM

    学习并转载自https://www.cnblogs.com/charlesblc/p/5993804.html 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJD ...

  5. ThreadLocal的设计理念与作用

    转自:http://www.iteye.com/topic/103804 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线 ...

  6. Python面试题之多个装饰器执行顺序

    疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子: def decorator_a(func): print 'Get in decorator_a' def ...

  7. Python面试题之列表推导式

    题目要求: 生成如下列表 [[0,0,0,0,0,],[0,1,2,3,4,],[0,2,4,6,8,],[0,3,6,9,12,]] (考察列表生成式和基本逻辑推理) 方法1: list1 = [] ...

  8. CSS3 简介

    CSS3 简介 对CSS3已完全向后兼容,所以你就不必改变现有的设计.浏览器将永远支持CSS2. CSS3被拆分为"模块".旧规范已拆分成小块,还增加了新的. 一些最重要CSS3模 ...

  9. 20145313张雪纯 《Java程序设计》第4周学习总结

    20145313张雪纯 <Java程序设计>第4周学习总结 教材学习内容总结 6.1何谓继承 程序代码重复时,可以把相同的程序代码提升为父类.继承除了可避免类之间重复的行为定义以外,还有i ...

  10. cogs 547:[HAOI2011] 防线修建

    ★★★☆   输入文件:defense.in   输出文件:defense.out   简单对比 时间限制:1 s   内存限制:128 MB 题目描述: 近来A国和B国的矛盾激化,为了预防不测,A国 ...