C/C++网络编程9——多进程服务器端实现
#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <signal.h>
#include <string> using namespace std; const int BUFFER_SIZE = ; void read_child_proc(int sig)
{
int status = ;
waitpid(-, &status, WNOHANG);
} int deal_error(string error_msg)
{
cout << error_msg << endl;
return ;
} int main()
{
// 创建套接字
int ser_sock = socket(PF_INET, SOCK_STREAM, );
if (ser_sock == -) {
return deal_error("socket() failed");
} // 套接字绑定ip及端口号
sockaddr_in ser_addr;
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ser_addr.sin_port = htons();
if (bind(ser_sock, (sockaddr *)&ser_addr, sizeof(ser_addr)) == -) {
close(ser_sock);
return deal_error("bind() failed");
} // 开始监听
if (listen(ser_sock, ) == -) {
close(ser_sock);
return deal_error("listen() failed");
} // 注册信号
signal(SIGCHLD, read_child_proc); // 子进程执行结束信号注册,防止僵尸进程产生
signal(SIGINT, exit); // CTRL+C信号注册,退出程序 while() {
sockaddr_in clnt_addr;
socklen_t addr_length = sizeof(clnt_addr);
int clnt_sock = accept(ser_sock, (sockaddr *)&clnt_addr, &addr_length);
if (clnt_sock == -) {
continue;
} cout << "new client connected: " << clnt_sock << endl;
pid_t pid = fork();
if (pid < ) {
continue;
} else if (pid == ) { // 子进程
close(ser_sock);
char message[BUFFER_SIZE];
int str_len = read(clnt_sock, message, BUFFER_SIZE-);
if (str_len > ) {
message[str_len] = '\0';
cout << message << endl;
}
close(clnt_sock);
sleep();
return ;
} else { // 父进程
close(clnt_sock);
}
} close(ser_sock);
return ;
}
C/C++网络编程9——多进程服务器端实现的更多相关文章
- C/C++网络编程7——多进程服务器端之fork函数
通过前面几节的内容,我们已经可以实现基本的C/S结构的程序了,但是当多个客户端同时向服务器端请求服务时,服务器端只能按顺序一个一个的服务,这种情况下,客户端的用户是无法忍受的.所以虚实现并发的服务器端 ...
- C/C++网络编程8——多进程服务器端之销毁僵尸进程
上一节提到,当子进程执行结束,父进程还在执行,在父进程结束之前子进程会成为僵尸进程,那么怎么销毁僵尸进程呢?父进程主动接收子进程的返回值. 销毁僵尸进程的方法: 1:使用wait函数 2:使用wait ...
- TCP/IP网络编程之多进程服务端(二)
信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...
- 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型
进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...
- TCP/IP网络编程之多进程服务端(一)
进程概念及应用 我们知道,监听套接字会有一个等待队列,里面存放着不同客户端的连接请求,如果有一百个客户端,每个客户端的请求处理是0.5s,第一个客户端当然不会不满,但第一百个客户端就会有相当大的意见了 ...
- linux网络编程echo多进程服务器
echo_server 多进程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #incl ...
- day31 网络编程,多进程多线程
今天的内容需要好好整理,概念性的东西比较多,都是需要理解的,这些是基层的理解,后期的很多知识都是要建立在今天的概念基础上的,以下两点是核心内容,必须要理解,自己把自己理解的注释加在里面: 进程就是程序 ...
- JAVA的网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- JAVA网络编程【转】出处不详
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
随机推荐
- bash_profile文件
bash_profile文件的作用 如何填写 如何生效
- .NET core 部署到Docker +Docker Protainer管理实现
.NET core 部署到Docker +Docker Protainer管理实现 上次说到将.net core的应用程序发布到Linux中(https://www.cnblogs.com/Super ...
- paramiko-tools
own dev # coding=utf-8 import paramiko import os import logging import json import unittest from sta ...
- openstack自动化搭建脚本
Openstack平台部署+节点扩容 1)搭建脚本 #!/bin/bash #openstack私有云平台部署 #脚本使用前提:三台虚拟机openstack(ip地址:.11至少4G内存,100G硬盘 ...
- Tarjan-有向图
(我到底是咕了多少知识点啊) 在有向图中tarjan主要用来求强连通分量并缩点 一.定义 强连通:如果两个顶点可以相互通达,则称两个顶点 强连通 强连通分量:如果有向图G的每两个顶点都 强连通,称G是 ...
- Plastic Bottle Manufacturer Tips: Use Caution For Plastic Bottles
Plastic bottles use polyester (PET), polyethylene (PE), polypropylene (PP) as raw materials, after a ...
- 《深入理解Java虚拟机》读书笔记四
第五章 调优案例分析与实战
- Map-HashMap 与 IF 判断内存占用对比
HashMap与IF判断内存占用对比,事实证明,Map对象在以下情况确实比IF判断占用内存低. HashMap占用内存:13000 package com.taiping.bky; import ja ...
- js 判断对象的属性是否存在
1.in运算符 (属性名 in 对象) 情况1:对象自身属性 var obj={a:1}; "a" in obj//true 情况2:对象继承的属性 var objA={a:1} ...
- redis-py相关
一 redis客户端命令 cmd进入redis客户端管理程序路径xx:\windows redis\redis-2.4.0-win32-win64\64bit 执行:redis-cli.exe -h ...