多进程回声服务器/客户端【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#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
随机推荐
- 伪类 :after 清除浮动的原理和方法
浮动元素容器的clearing问题1. 问题的由来有这样一种情形:在一个容器(container)中,有两个浮动的子元素.<div> <div style=" ...
- 获取Android设备的方向,Sensor和SensorManager实现手机旋转角度
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1009/425.html 带有g-sensor的Android设备上可通过API ...
- Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置
0x00 Redis简介 Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值 ...
- 20145335郝昊《java程序设计》第9周学习总结
20145335郝昊 <Java程序设计>第9周学习总结 教材学习内容总结 第16章 JDBC(Java DataBase Connectivity)即java数据库连接,是一种用于执行S ...
- 20145231熊梓宏 《网络对抗》 Bof逆向基础.shellcode注入
20145231网络对抗<逆向及Bof基础>shellcode注入 实验目的与要求 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.若该程序正常执行,则main函数会调用 ...
- php实现dota天梯、wow竞技场、lol排位赛匹配加分算法ELO
public function marchOpponents() { $rstep = Yii::$app->params['ratingStep'];//(随机范围) $rsN=100; $d ...
- hbase(一)region
前言 文章不含源码,只是一些官方资料的整理和个人理解 架构总览 这张图在大街小巷里都能看到,感觉是hbase架构中最详细最清晰的一张,稍微再补充几点. 1) Hlog是低版本hbase术语,现在称为W ...
- WIN7环境安装informatica 提示 不能创建Domain或者node
查看infa安装的bat文件install.bat,会发现,它调用的是.\Server\Windows\Disk1\InstData\VM\install.exe.所以,我们在安装执行,右键insta ...
- sql 筛选表中指定字段包含26某个小写字母
SELECT *from 表名WHERE 字段 COLLATE Chinese_PRC_CS_AS LIKE '%[abcdefghijklmnopqrstuvwxyz]%'筛选表中指定字段包含26某 ...
- java 枚举的写法
1.第一种形式: public interface PrealertConstants { enum platformCodeEnum{ CAINIAO(1), CLOSED(-5), OFFLINE ...