多进程实现并发服务器(TCP)

前提:基于Linux系统的学习

/*多进程实现并发服务器
父进程任务
  1.从未决连接队列中取出请求,建立和客户端的连接,cfd
  2.创建子进程
  3.close(cfd)
  4.负责子进程的收尸工作

子进程的任务
  1.close(sfd)
  2.子进程负责处理客户端消息
  close(sfd)
  exit(0)
*/
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
//信号自定义函数,来处理回收子进程资源
void doit(){
    wait(NULL);
    return;
} 

int main(){
    char buf[128];
    char IP[128];
    char*msg="hector pro_bf_serv\n";
    struct sockaddr_in serv;
    struct sockaddr_in clie;
    socklen_t clie_len;
    signal(SIGCHLD,doit);
    //创建socket通讯端口,sfd
    int sfd=socket(AF_INET,SOCK_STREAM,0);
    if(sfd==-1){
        perror("socket");
        return 0;
    }
    //初始化serv的成员
    serv.sin_family=AF_INET;
    serv.sin_port=htons(7007);
    serv.sin_addr.s_addr=htonl(INADDR_ANY);
    //将sfd绑定到服务器
    int b=bind(sfd,(struct sockaddr*)&serv,sizeof(serv));
    if(b==-1){
        perror("bind");
        return -1;
    }
    //将sfd设置为被动监听状态
    listen(sfd,5);
    while(1){
        clie_len=sizeof(clie);
        //建立和客户端的连接
        int cfd=accept(sfd,(struct sockaddr*)&clie,&clie_len);
        if(sfd==-1){
            perror("accept");
            return -1;
        }
        printf("%s\n",inet_ntop(AF_INET,&clie.sin_addr,IP,128));
        pid_t pid=fork();
        if(pid==-1){
            perror("fork");
            return -1;
        }
        if(pid==0){//子进程
            close(sfd);
            int r=read(cfd,buf,128);
            write(1,buf,r);
            write(cfd,msg,strlen(msg));
            close(cfd);
            exit(0);
        }
        else{//父进程
            close(cfd);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/qiuyuwutong/p/9350123.html

时间: 2024-11-13 06:39:30

多进程实现并发服务器(TCP)的相关文章

Python学习笔记(六)多进程实现并发服务器

这个相对于多进程更加简单,每accept一个新的连接就创建一个新的线程.代码如下: # coding: utf-8 import socket import sys import errno import threading from time import ctime class ClientThread(threading.Thread): def __init__(self, client_socket, client_address): threading.Thread.__init__

Python学习笔记(五)多进程实现并发服务器

  每创建一个TCP连接,就创建一个进程. 代码如下: # coding: utf-8 import socket import os import sys import signal import errno from time import ctime def hanlde_sigchld(a, b): (pid, status) = os.wait() print 'Child %d Finish, status = %d' % (pid, status) def handle_conne

Linux网络编程——tcp并发服务器(多进程)

一.tcp并发服务器概述 一个好的服务器,一般都是并发服务器(同一时刻可以响应多个客户端的请求).并发服务器设计技术一般有:多进程服务器.多线程服务器.I/O复用服务器等. 二.多进程并发服务器 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器.多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求.父进程继续等待其它客户的请求.这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是在客户服务器交互系统中.对于一个 TCP 服务器,客户与服务器的连接可能并不

TCP/IP 网络编程 (抄书笔记 3) -- 僵尸进程和多任务并发服务器

TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 Table of Contents 僵尸进程的产生 避免僵尸进程 信号 多任务的并发服务器 僵尸进程的产生 子进程先退出, 父进程没有退出 ==> 僵尸进程 父进程先退出, 子进程没有退出 ==> 子进程被 0 号进程回收, 不会产生僵尸进程 pid_t pid = fork(); if (pid == 0) { // child printf(&

LINUX环境并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 1.1 UDP循环服务器的实现方法: UDP循环服务器每次从套接字上读取一个客户端的请求->处理->然后将

Linux 网络编程——并发服务器的三种实现模型

服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 UDP 循环服务器的实现方法 UDP 循环服务器每次从套接字上读取一个客户端的请求 -> 处理

1高并发服务器:多进程服务器

 1多进程并发服务器 使用多进程并发服务器时要考虑以下几点: A.父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) B.系统内创建进程个数(和内存大小相关) C.进程创建过多是否降低整体服务性能(进程调度) 2.案例说明 server.c,代码如下: #include <stdio.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #i

linux网络编程-----&gt;高并发---&gt;多进程并发服务器

在做网络服务的时候并发服务端程序的编写必不可少.前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定. 常见的linux并发服务器模型: 多进程并发服务器 多线程并发服务器 select多路I/O转接服务器 poll多路I/O转接服务器 epool多路I/O转接服务器. 本次主要讨论多线程并发服务器模型: 使用多进程并发服务器时要考虑以下几点: 父进程最大文件描述个数(父进程中需要close关闭accpet返回的新文件描述符) 系统内创建进程个数(与内

Linux网络编程——tcp并发服务器(多线程)

tcp多线程并发服务器 多线程服务器是对多进程服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建.据统计,创建线程与创建进程要快 10100 倍,所以又把线程称为"轻量级"进程.线程与进程不同的是:一个进程内的所有线程共享相同的全局内存.全局变量等信息,这种机制又带来了同步问题. tcp多线程并发服务器框架: 我们在使用多线程并发服务器时,直接使用以上框架,我们仅仅修改client_fun()里面的内容. 代码示例: #