多进程并发服务器

data.h

 1 #ifndef DATA_H
 2 #define DATA_H
 3 #include <stdio.h>
 4 #include <string.h>
 5 #include <sys/types.h>
 6 #include <sys/stat.h>
 7 #include <sys/socket.h>
 8 #include <stdlib.h>
 9 #include <unistd.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
12 #include <netdb.h>
13 #include <errno.h>
14 #define PORT 45178
15 #define maxn 1100
16 #define BACKLOG 10
17 #define IP "127.0.0.1"
18 #endif

server.c

#include "data.h"
void send_message(int sockfd,struct sockaddr_in client)
{
    int num;
    char sendbuf[maxn],recvbuf[maxn];
    char cliname[maxn];
    printf("You get a connection from %s \n",inet_ntoa(client.sin_addr));
    num = recv(sockfd,cliname,maxn,0);
    printf("client name is %s\n",cliname);
    while(num = recv(sockfd,recvbuf,maxn,0))
    {
        num--;
        recvbuf[num] = ‘\0‘;
        printf("Receive a message is %s from <===>%s\n",recvbuf,cliname);
        send(sockfd,recvbuf,maxn,0);
    }        

}
int main()
{
    int sockfd;
        struct sockaddr_in server_in;
        if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
        {
            fprintf(stderr,"socket fail,error %s",strerror(errno));
            return -1;
        }
        bzero(&server_in,sizeof(server_in));
        server_in.sin_family = AF_INET;
        server_in.sin_port = htons(PORT);
    inet_pton(AF_INET,IP,&server_in.sin_addr);
    if(bind(sockfd,(struct sockaddr*)&server_in,sizeof(server_in)) == -1)
       {
            fprintf(stderr,"bind fail,error %s",strerror(errno));
                return -1;
    }
    listen(sockfd,BACKLOG);
    struct sockaddr_in client;
    int len = sizeof(client);
    int afd;
    int pid;
    while(1)
    {
        if((afd = accept(sockfd,(struct sockaddr*)&client,&len)) == -1)
        {
            fprintf(stderr,"accept fail,error:%s\n",strerror(errno));
            exit(1);
        }
        if((pid = fork()) > 0)
        {
            close(afd);
            continue;
        }
        else if(pid == 0)
        {
            close(sockfd);
            send_message(afd,client);
            exit(0);
        }
        else
        {
            printf("fork() error!\n");
            exit(0);
        }
    }
    close(sockfd);
}

client.c

#include "data.h"
void send_message(FILE *fp,int sockfd)
{
    char sendline[maxn];
    char recvbuf[maxn];
    int num;
    printf("connect to server!\n");
    printf("Please input client name :\n");
    if(fgets(sendline,maxn,fp) == NULL)
    {
        printf("input name error!\n");
        exit(1);
    }
    send(sockfd,sendline,maxn,0);
    while(1)
    {
        printf("Please input message !\n");
        if(fgets(sendline,maxn,fp) == NULL)  break;
        send(sockfd,sendline,strlen(sendline),0);
        bzero(&recvbuf,sizeof(recvbuf));
        recv(sockfd,recvbuf,maxn,0);
        int len = strlen(recvbuf);
        recvbuf[len] = ‘\0‘;
        printf("client receive message is %s\n",recvbuf);
    }
    printf("client exit!\n");
}
int main()
{
    struct sockaddr_in client_in;
       int sockfd;
        if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
        {
                fprintf(stderr,"socket fail,error %s\n",strerror(errno));
                return -1;
        }
        bzero(&client_in,sizeof(client_in));
    client_in.sin_family = AF_INET;
    client_in.sin_port = htons(PORT);
       inet_pton(AF_INET,IP,&client_in.sin_addr);
    connect(sockfd,(struct sockaddr*)&client_in,sizeof(client_in)) ;
    send_message(stdin,sockfd);
    close(sockfd);
    return 0;
}
时间: 2024-10-13 23:59:16

多进程并发服务器的相关文章

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

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

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网络编程——tcp并发服务器(多进程)

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

2高并发服务器:多线程服务器

 1多进程并发服务器 在使用线程模型开发服务器时需要考虑以下问题: A 调整进程最大文件描述符上限 B 线程如有共享数据,考虑线程同步 C 服务于客户端线程退出时,退出处理 D 2.案例说明 server.c,代码如下: /* server.c */ #include <stdio.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthr

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

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

Linux下几种并发服务器的实现模式

Linux下的几种并发服务器的设计模式 1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. 2>循环服务器和并发服务器 1.循环服务器:一个server只能一次只能接收一个client,当当前client结束访问之后才能进行下一个client的连接. 2.并发服务器:一个server同一时间可以响应很多客户端的访问. 3>select+多线程模式 并发服务器的三种实现方式 1.多进程并发

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

做网络服务的时候并发服务端程序的编写必不可少.前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定. 常见的linux并发服务器模型: 多进程并发服务器 多线程并发服务器 select多路I/O转接服务器 poll多路I/O转接服务器 epool多路I/O转接服务器. 本次主要讨论多线程并发服务器模型: 使用多线程模型开发服务时需要考虑以下问题 1.  调整进程内最大文件描述符上限. 2.  线程如有共享数据, 考虑线程同步. 3.  服务于客户端线程

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

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

linux学习之多高并发服务器篇(一)

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