并发服务器的第二种实现方法: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. HBase1.2.6 预分区后,数据不进入预定分区的一个 bug

    rowkey 如下: 19000015115042900001511504390000151150449000015115045900001511504690000151150479000015115 ...

  2. 20145316《Java程序设计》实验二报告

    20145316<Java程序设计>实验二报告 一.实验目的与要求 1.初步掌握单元测试和TDD. 2.理解并掌握面向对象三要素:封装.继承.多态. 3.初步掌握UML建模. 4.熟悉S. ...

  3. JS答辩习题

    php高中班javascript答辩题目 1 什么是javascript?  答:Javascript是一种专门设计用来增强网页交互性的脚本语言,它也是一种解释型语言. 2 Javascript与C语 ...

  4. c++ 中 BOOL与bool TRUE与true FALSE与false 区别

    转自:http://blog.chinaunix.net/uid-28458801-id-3941112.html   FALSE/TRUE与false/true的区别 1.FALSE/TRUE与fa ...

  5. Visual Studio 2015 初体验

    据微软介绍每次发布的新版本,都承载着为开发者提供最高效的Visual Studio开发体验的使命.Visual Studio 2015亦延续了这一趋势,为开发者带来了进一步的生产力创新,包括调试和诊断 ...

  6. MySQL多版本并发控制机制(MVCC)-源码浅析

    MySQL多版本并发控制机制(MVCC)-源码浅析 前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<事务处理-概念与技术>>诚然 ...

  7. mysql5.6创建索引导致锁表阻塞查询

    结论:添加索引时,若果有对该表的慢查询,会导致索引添加延时等待   添加索引语句:alter table tb_name add index idx_xx(col_name);   执行添加索引的SQ ...

  8. JavaConfig 使用Java代码进行显示配置

    从Spring 3起,JavaConfig功能已经包含在Spring核心模块,它允许开发者将bean定义和在Spring配置XML文件到Java类中. 需要先加载spring-context 包 &l ...

  9. linux(一)export的生命周期

    本文从shell执行的角度分析export变量的生命周期 # 只对当前shell环境起作用,比如通过不同的远程ssh就是不同的shell环境 export k=v 当运行一个.sh文件或者是shell ...

  10. codeforce 35C fire again

    2017-08-25 17:04:07 writer:pprp 题目描述: • Codeforces 35C Fire Again• N*M的格子,最开始有K个点 (坐标给定) 开始着火• 每一秒着火 ...