C/C++网络编程9——多进程服务器端实现
2024-10-08 10:40:55
#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 ;
}
最新文章
- Xamarin与Visual stuido2015离线安装包分享
- Tensorflow mlp二分类
- ajax同步的实现
- Linux 忘记root密码 的解决办法
- 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务(老罗学习笔记6)
- 四、使用Maven和使用Eclipse构建javaWeb项目
- 宏定义 define
- MyEclipse 中文注释乱码
- response重定向的网址中有中文乱码的解决办法
- 解决 CentOS7 安装完成后ifconfig命令不能用
- Java编程的逻辑 (87) - 类加载机制
- Intel Digital Innovation Industry Summit(2018.08.17)
- How to uninstall Maya on a Mac
- InnoDB表回收空间
- 利用 Azure Devops 创建和发布 Nuget 包
- 第9月第6天 push pop动画 生成器模式(BUILDER)
- SVN的Hooks功能--强制添加注释
- 时间操作(JavaScript版)—年月日三级联动(默认显示系统时间)
- OpenStack入门篇(二十)之实现阿里云ESC多FLAT网络
- SSIS 数据流的执行树和数据管道
热门文章
- SQL Server带列名导出到Excel(Export to CSV with headers)的几个思路
- 线性筛-mobius,强大O(n)
- springboot jar文件打zip包运行linux环境中
- js中yyyymmdd hh:mm:ss字符转换为Date
- Springboot项目搭建(3)-shiro登录
- Linux03——磁盘分区和挂载
- 开学考试学生成绩管理Java
- UTC/GMT/CST/RTC
- 黑帽JS跳转
- 点击<;a href=";#";>;阻止自动跳转到顶部方法