多进程回声服务器/客户端【linux】
并发服务器端
#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】的更多相关文章
- Linux多进程CS服务器简单测试
Linux多进程CS服务器简单实现 server端 多进程实现多用户连接,即每个用户一个连接,这里仍然用server将收到的字符串转大写后返回给客户端. 代码实现 #include <stdio ...
- 简单通讯聊天 群聊功能 Windows下的客户端 Linux下的epoll服务器
1 服务器代码 Linux eclipse C++ //======================================================================= ...
- CentOS_6.5 64位系统,安装git服务器+客户端
================ git服务器安装 ==================== CentOS安装Git服务器 Centos 6.4 + Git 1.8.2.2 + gitosis## . ...
- nginx配置SSL实现服务器/客户端双向认证
http://blog.csdn.net/kunoy/article/details/8239653 本人不才,配置了两天,终于搞出来了,结合网上诸多博文,特此总结一下! 配置环境: Ubuntu 1 ...
- 负载均衡配置下的不同服务器【Linux】文件同步问题
负载均衡配置下的不同服务器[Linux]文件同步问题2017年04月13日 22:04:28 守望dfdfdf 阅读数:2468 标签: linux负载均衡服务器 更多个人分类: 工作 问题编辑版权声 ...
- python day 20: 线程池与协程,多进程TCP服务器
目录 python day 20: 线程池与协程 2. 线程 3. 进程 4. 协程:gevent模块,又叫微线程 5. 扩展 6. 自定义线程池 7. 实现多进程TCP服务器 8. 实现多线程TCP ...
- 安卓DJ113舞曲网应用客户端 项目源码(服务器+客户端)
Android DJ113舞曲网app客户端 播放器源码 项目源码(服务器+客户端),这个项目整体有点类似天天动听的效果,非常漂亮的,支持第三方登录等功能,非常完整的一个音乐项目. 源码下载:htt ...
- 云服务器 ECS Linux 系统盘数据转移方法
转自:https://help.aliyun.com/knowledge_detail/41400.html 问题描述 购买云服务器 ECS Linux 服务器时,未购买数据盘,使用一段时间后,随着业 ...
- C#中国象棋+游戏大厅 服务器 + 客户端源码
来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
随机推荐
- iClap是什么,能解决什么问题?
移动互联网时代,APP体验度.用户粘性和活跃度关乎企业命脉,但是市面上使用的办公工具却不足以解决企业存在的问题,iClap应运而生,颠覆互联网企业的传统协作方式,改变了种子用户与企业的互动方式,为企业 ...
- UVALive - 7740 Coding Contest 2016 青岛区域赛 (费用流)
题意:每个点i有\(s_i\)个人和\(b_i\)份食物,每个人都要找到一份食物.现在有M条有向边,从点i到点j,容量为c,第一次走过不要紧,从第二次开始就要承担\(p(0<p<1)\)的 ...
- POJ - 3308 Paratroopers (最小点权覆盖)
题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ...
- Linux ./configure --prefix 命令是什么意思?
源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(makeinstall). Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./conf ...
- Hexo博客部署codingNet静态资源无法加载
用Hexo搭建的个人博客,部署到github的pages的话,好像百度搜索不到.所以在国内的codingNet的pages服务也一起部署一下,这样方便国内国外搜索引擎收录进来.具体部署教程我是参考这里 ...
- php与js 编码解码交互
javascript: var fontcolorEncode=encodeURIComponent(fontcolor.value); //编码 php: $fontcolordecode= u ...
- Jquery9 事件对象
学习要点: 1.事件对象 2.冒泡和默认行为 JavaScript 在事件处理函数中默认传递了 event 对象,也就是事件对象.但由于浏览器的兼容性,开发者总是会做兼容方面的处理.jQuery 在封 ...
- MySQL—记录的增删改查操作
1.插入记录: 方法一:INSERT [INTO] tbl_name [(col_name,···)] {VALUES|VALUE} ({expr |DEFAULT},···),(···),··· 例 ...
- 混合开发的大趋势之一React Native之页面跳转
转载请注明出处:王亟亟的大牛之路 最近事情有点多,没有长时间地连贯学习,文章也停了一个多礼拜,愧疚,有时间还是继续学习,继续写! 还是先安利:https://github.com/ddwhan0123 ...
- Linux命令:chmod、chgrp、chown的区别
chmod是更改文件的权限: chgrp只是更改文件的属组: chown是更改文件的属主与属组. 1.chmod:更改文件的权限 文件权限的设置方式有两种,分别是数字和标记. mode : 权限设定字 ...