多进程解决socket并发问题

概念了解

上一篇博客的socket程序只能实现服务器连接一个客户端,不能解决并发问题,及多个客户端同时连接。下面的程序采用多进程的思想,在accept()调用之后利用fork()产生子进程。

代码实现

只提供服务器端代码,客户端不用改。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define SERV_PORT 9998
#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    socket_fd, connect_fd;
    struct sockaddr_in     servaddr;
    char    buf[MAXLINE],sendbuf[MAXLINE];
    int     len;
    pid_t   pid;
    if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }
    //初始化
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;  
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
    servaddr.sin_port = htons(SERV_PORT);
    //调用bind函数,绑定
    if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) <0)
    {
         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
         exit(0);
    }
    //调用listen函数监听端口
    if( listen(socket_fd, 10) <0)
    {
         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
         exit(0);
    }
    printf("waiting for client's connection......\n");

       //调用fork函数实现多进程,注意accept函数在fork调用之后
        if(pid=fork()<0)
        {
            perror("fork ");
            exit(-1);
         }
         if(pid==0)
        {
          connect_fd = accept(socket_fd,(struct sockaddr*)NULL,NULL);   
          while((len= recv(connect_fd, buf, MAXLINE, 0))>0)
        {
       printf("receive message from client: %s\n", buf);
       //向客户端发送回应数据
        printf("send message to client: \n");
        fgets(sendbuf, 4096, stdin);
       if( send(connect_fd, sendbuf, strlen(sendbuf), 0) < 0)
         {
            printf("send messaeg error: %s(errno: %d)\n", strerror(errno), errno);
            exit(0);
         }
         }
         }
  close(connect_fd);
  close(socket_fd);
}

猜你喜欢

转载自blog.csdn.net/xn6666/article/details/80309422