并发服务器端

 #include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <cstring>
#include <arpa/inet.h>
#include <signal.h>
#include <cstdlib>
#include <iostream>
using namespace std;
void child_over(int sig)//信号处理器
{
int state;
int child_pid = waitpid(-, &state, WNOHANG);
if(WIFEXITED(state))
{
printf("id = %d 的进程正常终止,返回值是 %d\n",
child_pid, WEXITSTATUS(state));
}
}
int main(int argc, char **argv)
{
int ser_sock, cli_sock;
char s[];
sockaddr_in ser_addr, cli_addr;
struct sigaction act;
act.sa_handler = child_over;
sigemptyset(&act.sa_mask);
act.sa_flags = ;
sigaction(SIGCHLD, &act, );//信号注册函数 ser_sock = socket(PF_INET, SOCK_STREAM, ); 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"); while()
{
socklen_t s_len = sizeof(cli_addr);
cli_sock = accept(ser_sock, (sockaddr *)&cli_addr, &s_len);
if(cli_sock == -) continue; pid_t pid = fork();
if(pid == )
{
close(ser_sock);
int len;
while(len = read(cli_sock, s, ))
{
if(!len) break;
s[len] = ;
printf("message from client : %s\n", s);
write(cli_sock, s, len);
}
close(cli_sock);
return ;
}
else
close(cli_sock);
}
close(ser_sock);
return ;
}

I/O分割的回声客户端

 #include <stdio.h>
#include <arpa/inet.h>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
using namespace std;
int main(int argc, char **argv)
{
int sock;
sockaddr_in ser_addr;
char s[];
sock = socket(PF_INET, SOCK_STREAM, );
if(sock == -) puts("socket error");
memset(&ser_addr, , sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = inet_addr(argv[]);
ser_addr.sin_port = htons(atoi(argv[]));
if(connect(sock, (sockaddr *)&ser_addr, sizeof(ser_addr)) == -)
puts("connect error"); pid_t pid = fork();
if(pid == )
{
while()
{
puts("wait for message...");
scanf("%s", s);
if(!strcmp(s, "q") || !strcmp(s, "Q"))
{
shutdown(sock, );
break;
}
else
write(sock, s, strlen(s));
sleep(0.5);
}
}
else
{
while()
{
int len = read(sock, s, );
if(len == ) break;
s[len] = ;
printf("message from server:%s\n", s);
}
}
close(sock);
return ;
}

客户端31行用shutdown而不用close的原因是:

注意:
1.如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放。
2.在多进程中如果一个进程中shutdown(sfd, SHUT_RDWR)后其它的进程将无法进行通信. 如果一个进程close(sfd)将不会影响到其它进程.
3.shutdown,不考虑描述符的参考数,可选择中止一个方向的连接, 但是仅仅是断开连接,仍然需要close释放链接占用的文件描述符。

多进程回声服务器/客户端【linux】的更多相关文章

  1. Linux多进程CS服务器简单测试

    Linux多进程CS服务器简单实现 server端 多进程实现多用户连接,即每个用户一个连接,这里仍然用server将收到的字符串转大写后返回给客户端. 代码实现 #include <stdio ...

  2. 简单通讯聊天 群聊功能 Windows下的客户端 Linux下的epoll服务器

    1 服务器代码  Linux eclipse C++ //======================================================================= ...

  3. CentOS_6.5 64位系统,安装git服务器+客户端

    ================ git服务器安装 ==================== CentOS安装Git服务器 Centos 6.4 + Git 1.8.2.2 + gitosis## . ...

  4. nginx配置SSL实现服务器/客户端双向认证

    http://blog.csdn.net/kunoy/article/details/8239653 本人不才,配置了两天,终于搞出来了,结合网上诸多博文,特此总结一下! 配置环境: Ubuntu 1 ...

  5. 负载均衡配置下的不同服务器【Linux】文件同步问题

    负载均衡配置下的不同服务器[Linux]文件同步问题2017年04月13日 22:04:28 守望dfdfdf 阅读数:2468 标签: linux负载均衡服务器 更多个人分类: 工作 问题编辑版权声 ...

  6. python day 20: 线程池与协程,多进程TCP服务器

    目录 python day 20: 线程池与协程 2. 线程 3. 进程 4. 协程:gevent模块,又叫微线程 5. 扩展 6. 自定义线程池 7. 实现多进程TCP服务器 8. 实现多线程TCP ...

  7. 安卓DJ113舞曲网应用客户端 项目源码(服务器+客户端)

    Android DJ113舞曲网app客户端 播放器源码  项目源码(服务器+客户端),这个项目整体有点类似天天动听的效果,非常漂亮的,支持第三方登录等功能,非常完整的一个音乐项目. 源码下载:htt ...

  8. 云服务器 ECS Linux 系统盘数据转移方法

    转自:https://help.aliyun.com/knowledge_detail/41400.html 问题描述 购买云服务器 ECS Linux 服务器时,未购买数据盘,使用一段时间后,随着业 ...

  9. C#中国象棋+游戏大厅 服务器 + 客户端源码

    来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...

随机推荐

  1. es6的Set和Map数据结构

    Set 和 Map 数据结构 Set WeakSet Map WeakMap Set § ⇧ 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set ...

  2. SVN文件版本太旧问题解决

    错误信息如下: E155036: The working copy at '/Users/...' is too old (format 10) to work with client version ...

  3. 论文笔记:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

    ICML, 2015 S. Ioffe and C. Szegedy 解决什么问题(What) 分布不一致导致训练慢:每一层的分布会受到前层的影响,当前层分布发生变化时,后层网络需要去适应这个分布,训 ...

  4. zookeeper 监听事件 NodeCacheListener

    zookeeper 监听事件 NodeCacheListener NodeCacheListener一次注册,每次监听,但是监听不到操作类型,不知道是增加?删除?还是修改? 1.测试类: packag ...

  5. 使用selenium前学习HTML(3)— 属性

    <!-- HTML标签可以拥有属性,属性提供元素的更多的信息: 属性总是以名称/值对的形式出现,比如:name="value". 属性总是在 HTML 元素的开始标签中规定. ...

  6. selenium 之定位方法

    1 id 定位 driver.find_element_by_id() HTML 规定id 属性在HTML 文档中必须是唯一的.这类似于公民的身份证号,具有很强的唯一性 from selenium i ...

  7. [日志] spring boot + logback 日志输出配置

    一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...

  8. ODP.NET Oracle12.1版本免安装发布(IIS WebServices)

    1.ODP.NET必须的DLL OCI.DLL Oracle.DataAccess.dll OraOps12.dll msvcr100.dll oraociei12.dll oraons.dll 2. ...

  9. 20145303刘俊谦 《Java程序设计》第三周学习总结

    20145303刘俊谦 <Java程序设计>第三周学习总结 教材学习内容总结 1.类与对象: 类:对现实生活中事物的描述,定义类时用关键词class 对象:这类事物实实在在存在的个体,利用 ...

  10. C#的switch case注意

    参数可以是 switch 语句中的 参数必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型. 所以用string也可以,6666