Linux网络编程之多进程

多进程模型

多进程模型下,注意如何在进程之间通信以及孤儿进程和僵尸进程的处理,可以外配上进程池作为计算任务/异步任务的处理。

//fork server
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <signal.h>

void run();

int main(int argc, char *argv[])
{
    run();
    return 0;
}

void handle_client_socket(int clientfd){
    //read from client socket
    char readbuf[1024];
    ssize_t readlen;
    while(1){
        readlen = read(clientfd, readbuf, sizeof(readbuf));
        if (readlen==-1){
            perror("read client error");
            close(clientfd);
            return;
        }else if(readlen==0){
            break;
        }else{
            fwrite(readbuf, readlen, 1, stdout);
            //write back to client
            if(write(clientfd, readbuf, readlen)==-1){
                perror("write back to client error");
                close(clientfd);
                return;
            }
        }
    }
    close(clientfd);
}

void reap(int signum)
{
    while(waitpid(-1, NULL, WNOHANG)>0);
    return;
}
void run()
{
    //get hostent
    struct hostent *h = gethostbyname("127.0.0.1");
    if(!h){
        perror("resolve host failed");
        exit(EXIT_FAILURE);
    }

    //create server socket
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if(fd==-1){
        perror("socket create failed");
        exit(EXIT_FAILURE);
    }

    //server bind
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_addr = *(struct in_addr *)h->h_addr_list[0];
    server.sin_port = htons(8000);
    if(bind(fd, (struct sockaddr *)&server, sizeof(server))==-1){
        perror("bind error");
        close(fd);
        exit(EXIT_FAILURE);
    }

    int reuse = 1;
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))<0){
        perror("error setsockopt");
        exit(EXIT_FAILURE);
    }
    //server listen
    if(listen(fd,20)==-1){
        perror("listen error");
        close(fd);
        exit(EXIT_FAILURE);
    }

    signal(SIGCHLD,reap);

    //server loop
    while(1){
        //struct sockaddr_in client;
        struct sockaddr_storage client;
        int clientfd;
        socklen_t socklen = sizeof(client);
        clientfd = accept(fd, (struct sockaddr *)&client, &socklen);
        if (clientfd==-1){
            perror("error accept");
            close(fd);
            exit(EXIT_FAILURE);
        }
        pid_t pid = fork();
        if(pid==-1){
            perror("fork error");
            close(fd);
            exit(EXIT_FAILURE);
        }
        if (pid==0){
            //close parent listening fd
            close(fd);
            handle_client_socket(clientfd);
            exit(EXIT_SUCCESS);
        }
        if (pid>0){
            //close client fd
            close(clientfd);
        }
    }
}
时间: 2024-11-03 03:17:42

Linux网络编程之多进程的相关文章

Linux网络编程使用多进程实现服务器并发访问

  采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来的文字后,原样返回给客户端. 3.客户端接收到服务器的发来的文字后,输出到标准输出,然后继续以上步骤. 服务器端过程:建立好监听套接字后,等待客户端的连接,接收到一个连接后,创建一个子进程来与客户端进行通信,主进程则继续等待其他客户端的连接.代码如下: #include #include #include #include #include #incl

Linux网络编程入门

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端          网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端         在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一         个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序.  服务端        

linux网络编程libpcap获取网络接口信息失败

问题描述 linux网络编程libpcap获取网络接口信息失败 #include typedef u_int32_t in_addr_t; struct in_addr{ in_addr_t s_addr;}; void main(){ char error_content[PCAP_ERRBUF_SIZE]; struct in_addr net_ip_address; struct in_addr net_mask_address; char *net_interface; char *ne

Linux网络编程 epoll中EPOLLIN EPOLLOUT信号无法触发

问题描述 Linux网络编程 epoll中EPOLLIN EPOLLOUT信号无法触发 比如 if(events[i].events&EPOLLIN) { int bytes_read=read(m_sockfd,read_buf,READ_BUFFER_SIZE); } 这样会触发EPOLLIN 但如果把read()封装到比如service类的sread()函数中 if(events[i].events&EPOLLIN) { service.sread() } 便不会触发EPOLLIN事

Linux 网络编程 epoll中的EPOLLIN EPOLLOUT如何触发

问题描述 Linux 网络编程 epoll中的EPOLLIN EPOLLOUT如何触发 代码很长只截取关键部分 //服务器端 #include #include #include #include #include #include #include #include #include #include"locker.h" #include"threadpool.h" #include"http_conn.h" #include"htt

Linux 网络编程 之 TCP状态转换

                                               Linux 网络编程 之 TCP状态装换                                                                       从上面的图中可以看出,TCP共有11状态.由TCP发送和接收的数据有:ACK, FIN, SYN,RST.对于一个还未调用connect的client和未调用listen的server来说,它们都处于CLOSED状态.ACK

Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

                       Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO_LINGER(仅仅适用于TCP,SCTP), SO_REUSEADDR.   SO_LINGER 在默认情况下,当调用close关闭socke的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回.

socket-刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗?

问题描述 刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗? 如果可以是不是可以用这样的流程,先socket()创建描述符, 然后再bind()绑定一个IP地址跟端口? 解决方案 实在是没看懂你的需求 解决方案二: listen是侦听本机的端口,只有服务器端才需要这么做,你想监听其他主机,就需要在局域网路由器等上面做流量监控 解决方案三: 可以,基于socket的编程,只要绑定对IP地址就可以了.

线程-windows 和 linux 网络编程文件传输

问题描述 windows 和 linux 网络编程文件传输 windows 两个线程,linux 两个进程,现在想传输一个文件,windows 这边其中的一个进程传一部分,剩下的由另外的一个进程来传.有什么好的方法吗?找了好多可是都没有相关的资料.谢谢大家. 解决方案 就是socket通信传递,windows做客户端,linux做服务端 解决方案二: Linux与Windows下文件传输windows到linux的文件传输linux 和 windows 文件传输