TCP并发服务器(一)——每个客户一个子进程

TCP并发服务器(一)——每个客户一个子进程

1.说明

这是最传统的并发服务器,对于每一个客户请求fork一个子进程。问题在于每次fork一个子进程比较耗费时间,下面会讲预创建进程。

程序代码基于UNP的库。

程序在使用进程的模式下是最慢的。

2.代码

#include "unp.h"

int main(int argc, char *argv[])
{
    int listenfd;
    socklen_t addrlen;
    if (argc = 2) {
        listenfd = Tcp_listen(NULL, argv[1], &addrlen);
    } else if (argc ==3) {
        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
    } else {
        err_quit("Usage: a.out [ <host> ] <port#>");
    }
    struct sockaddr *cliaddr = (struct sockaddr*)Malloc(addrlen);

    void sig_chld(int), sig_int(int), web_child(int);
    Signal(SIGCHLD, sig_chld);
    Signal(SIGINT, sig_int);

    for ( ; ;) {
        socklen_t clilen = addrlen;
        DPRINTF("Wait for a connection\n");
        int connfd = accept(listenfd, cliaddr, &clilen);    //clilen用于值-结果参数,可能会改变,所以每次重新赋值,所以此处不能使用addrlen
        DPRINTF("Accept a connection\n");
        if (connfd < 0) {
            if (errno == EINTR) {
                continue;
            } else {
                err_sys("accept() error");
            }
        } 

        pid_t childpid = Fork();
        if (childpid == 0) {        //child process
            DPRINTF("Fork a child process\n");
            Close(listenfd);        //close listening socket
            web_child(connfd);        //process request
            exit(0);
        }
        Close(connfd);                //parent closes connected socket
    } //end for(;;)

    return 0;
}

void sig_int(int)
{
    DPRINTF("sig_int()\n");
    void pr_cpu_time(void);
    pr_cpu_time();
    exit(0);
}

void sig_chld(int)
{
    static int cnt = 0;
    pid_t pid;
    int stat;
    //param1: 想要等待的PID;-1: 等待第一个终止的子进程
    //param2: 子进程的终止状态(整数)
    //param3: 附加选项;WNOHANG:没有子进程终止时,不阻塞
    while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) {    //成功:返回进程ID > 0, 出错:0或-1
        DPRINTF("Waitpid for %d child process\n", ++cnt);
        ;
    }

    return;
}

  

TCP并发服务器(一)——每个客户一个子进程,布布扣,bubuko.com

时间: 2024-10-25 03:13:23

TCP并发服务器(一)——每个客户一个子进程的相关文章

TCP并发服务器,每个客户一个子进程

在阅读完<unix 网络编程:卷一>之后,感觉作者真是unix下编程的大师级的人物.而对于我个人而言,每次阅读完一本技术书籍之后,一定还是得自己重新再写一遍程序(换点内容),复习书本中的内容(大致结构,或者说思想,相同),否则,你很难做到真的理解并掌握的地步. Okay,今天我带来的是服务器模型中的第一种,也是最基本最常用的一种模型–TCP并发服务器,每个客户一个子进程. 先简单介绍一下:TCP并发服务器,每个客户一个子进程,也就是说并发服务器调用fork派生一个子进程来处理每个子进程,使得服

TCP并发server,每个客户一个子进程

今天笔者带来的是server型号第一,这是最经常使用的模型的最基本的一个–TCP并发server,每个客户一个子进程. 首先简单介绍:TCP并发server,每个客户一个子进程,并发server调用fork派生一个子进程来处理每一个子进程,使得server能够同一时候为多个客户服务,每一个进程一个客户. 客户数目的唯一限制是操作系统对以其名义执行server的用户ID能够同一时候拥有多少子进程的限制. 详细到我们的需求,我们的client发送某个指令,服务端接收.假设符合服务端的要求.就将当时的

TCP并发服务器(五)——每个客户一个线程

TCP并发服务器(五)——每个客户一个线程 1.说明 前面4个版本都是关于进程的,可以将进程改为线程来实现. 这个最简单的版本也快于前面的所有预先派生进程的版本. 2.代码 #include "unpthread.h" void sig_int(int signo) { DPRINTF("sig_int()\n"); void pr_cpu_time(void); pr_cpu_time(); exit(0); } void *doit(void *arg) { v

TCP并发服务器(四)&mdash;&mdash;预创建子进程,accept互斥锁

1.说明 Posix文件上锁可移植到所有Posix兼容系统,但是涉及到文件系统操作,可能比较费时. 本次使用线程上锁保护accept,这不仅适用于同一进程中各线程之间上锁,也适用于不同进程之间上锁. 2.进程间使用互斥锁要求 (1) 互斥锁变量必须存放在由所有进程共享的内存去. (2) 必须告知线程函数库这是在不同进程之间共享的互斥锁.要求线程支持PTHREAD_PROCESS_SHARED属性.默认属性PTHREAD_PROCESS_PRIVATE, 只允许在单个进程内使用.   3.代码 支

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

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

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

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

tcp并发服务器(c20w)

** 原创文章,请勿转载 ** 并发服务器是一个老生常谈的话题,今天这里也写一个. 1. 目标: 同时在线连接20万(c20w). 开发语言:重要的事情说三遍,GOLANG, GOLANG, GOLANG! 那为什么是20W,不是30W或其它? 这个数字随意.   :) 2. 环境: 虚拟机(xenserver),    虚出6台机器(OS: CentOS 6.6 64bit) : . 一台服务器8核CPU,2G内存 . 五台客户端2核CPU,2G内存 3.  改centos几个参数, 6台机器

Linux网络编程——tcp并发服务器(poll实现)

想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程--I/O复用之poll函数> 代码: #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/select.h> #include <sys/time.h> #include <sys/socket.h> #incl

UNIX网络编程2.9端口号2.10端口号与TCP并发服务器