linux编程实例--简单多进程服务器

主要利用fork事先创建若干个进程,并发处理多个客户端的连接,返回当前系统时间。具体代码如下:

server.c

# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <time.h>
# include <string.h>
# include <stdio.h>
# include <signal.h>
# include <errno.h>
# include <unistd.h>

#define BUFFLEN 1024
#define SERVER_PORT 3333
#define BACKLOG 5
#define PIDNUM 3

static void handle_connect(int serv_fd)
{
    int client_fd;
    struct sockaddr_in client_addr;
    int len=sizeof(client_addr);

    while(1)
    {
        if((client_fd=accept(serv_fd,(struct sockaddr*)&client_addr,&len))<0)
        {
        perror("accept");
        exit(errno);
        }

        printf("accept Done,the process id=%d\n",getpid());

        time_t now;
        char buff[BUFFLEN]={0};
        int n=0;

        memset(buff,0,BUFFLEN);
        n=recv(client_fd,buff,BUFFLEN,0);

        if(n>0&&!strncmp(buff,"TIME",4))
        {
            memset(buff,0,BUFFLEN);

            now=time(NULL);
            sprintf(buff,"%24s\r\n",ctime(&now));

            send(client_fd,buff,strlen(buff),0);
        }
        close(client_fd);
    }
}

void sig_int(int num)
{
    exit(1);
}

int main(int argc, char* argv[])
{
    int servfd;
    unsigned int lisnum=3;
    struct sockaddr_in serv_addr;
    signal(SIGINT,sig_int);
    servfd=socket(AF_INET,SOCK_STREAM,0);

    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    serv_addr.sin_port=htons(SERVER_PORT);

    int err=bind(servfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

    if(listen(servfd,lisnum) == -1){
        perror("listen");
        exit(errno);
    }else
        printf("the server is listening!\n");

    pid_t pid[PIDNUM];
    int i=0;

    for(i=0;i<PIDNUM;i++)
    {
        pid[i]=fork();
        if(pid[i]==0)
        {
            handle_connect(servfd);
        }
    }

    while(1);

    close(servfd);

    return 0;

}

client.c

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<time.h>
#include<string.h>
#include<stdio.h>
#include<errno.h>

#define BUFFLEN 1024
#define SERVER_PORT 3333

int main(int argc,char*argv[])
{
    int clientfd;
    struct sockaddr_in serv_addr;
    time_t now;
    char buff[BUFFLEN]={0};

    int n=0,err;

    clientfd=socket(AF_INET,SOCK_STREAM,0);

    memset(&serv_addr,0,sizeof(serv_addr));

    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    serv_addr.sin_port=htons(SERVER_PORT);

    if((err=connect(clientfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)))<0)    {
        perror("connect");
        exit(errno);
    }
    printf("Connected Done!!\n");

    memset(buff,0,BUFFLEN);
    strcpy(buff,"TIME");

    send(clientfd,buff,strlen(buff),0);

    memset(buff,0,BUFFLEN);

    n=recv(clientfd,buff,BUFFLEN,0);

    if(n>0)
    {
        printf("TIME:%s\n",buff);
    }

    close(clientfd);

    return 0;

}

linux编程实例--简单多进程服务器

时间: 2024-12-29 09:51:10

linux编程实例--简单多进程服务器的相关文章

Linux 网络编程六(多进程服务器僵尸进程解决方案)

僵尸进程解决方案 1.忽略SIGCHLD信号,这样不会出现僵尸进程 2.安装信号,父进程接收到SIGCHLD信号后,wait()子进程 注意:这里的客户端有两个进程,一个接收信息,一个发送信息,当客户端退出时,会将sockfd套接字关闭两次 //头文件 int server_socket(); int client_socket(); //服务器端 #include "pub.h" int main(int arg,char *args[]) { server_socket(); re

socket编程:简单TCP服务器/客户端编程

其实对于socket:我们需要理解的是他提供了一种编程概念,利用socket就可以利用系统已经封装好的内部进行通信,我们只需要关注应用层方面的数据控制就OK了. 一. 套接字(socket) socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口.而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此"IP+端口号"就可以称之为socket. 两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个&

socket编程:简单UDP服务器/客户端编程

对于之前的TCP协议而言,他是可靠的字节流传输,而在socket编程中,在不需要保证数据传输正确安全的情况下.或者由用户自己完成传输确认情况/服务端客户端自己实现数据传输.套接字编程也提供了UDP协议的方法. 基于UDP(不是面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)和服务器端进行通信(sendto) (3)关闭套接字 因为在socket编程中,UDP是针对数据报的数据传输,所以socket专门定义了UDP所使用的函数接口.

Windows Socket 编程_ 简单的服务器/客户端程序

转载自:http://blog.csdn.net/neicole/article/details/7459021 一.程序运行效果图 二.程序源代码 三.程序设计相关基础知识 1.计算机网络    2.IP地址    3.协议    4.网络体系结构    5.TCP/IP体系结构与特点    6.客户机/服务器模式    7.TCP/IP特点    8.套接字的引入    9.面向 连接/无连接 的套接字的系统调用时序图/流程图 一.程序运行效果图 二.程序源代码 [cpp] view pla

【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)

RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [实验目的] 1.熟练掌握线程的创建与终止方法: 2.熟练掌握线程间通信同步方法: 3.应用套接字函数完成多线程服务器,实现服务器与客户端的信息交互. [实验内容] 通过一个服务器实现最多5个客户之间的信息群发. 服务器显示客户的登录与退出: 客户连接后首先发送客户名称,之后发送群聊信息: 客户输入bye代表退

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

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

PHP多进程编程实例

这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进程太慢,那么,试试用多进程来搞吧.这篇文章将会介绍一下PHP多进程的基本需求,如何创建多进程以及基本的信号控制,暂时不会告诉你如何进行进程间通信和信息共享. 1. 准备 在动手之前,请确定你用的不是M$ Windows平台(因为我没有Windows).Linux / BSD / Unix应该都是没问

Linux下shell编程实例

1. 判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下 read -p "input a file:" filename if [ -b $filename -o -c $filename ] then cp $filename /dev/ fi 2.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "input another nu

linux僵死进程与并发服务器编程

序 僵死(zombie)进程简而言之就是:子进程退出时,父进程并未对其发出的SIGCHILD信号进行适当处理,导致子进程停留在僵死状态等待其父进程为其收尸,这个状态下的子进程就是僵死进程. 因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源.对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求.如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源.如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能. 查