并发式TCP服务器的设计

在之前的TCP服务器设计时,采用的是循环接收并处理客户机的请求的轮询方式,这样的效率太低,因为当多个客户机同时向服务器发出请求时,就会导致后面来的客户机一直停滞在那里,直到服务器处理完前一个客户机的请求之后才会处理下一个服务器的请求。

所以一个较好的办法就是采用多进程来处理。利用主进程来接受客户机的请求,得到一个请求就创建一个子进程来处理数据,这样就可以在同一时刻处理多个客户机发来的请求。当然也可以用多线程。


#include
#include
#include
#include
#include

#define portnum 3333

int main()
{
    int sockfd,new_fd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    char buffer[128];
    int nbyte;
    int sin_size;
    int pid;
     
    //创建socket
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
    printf("create socket error\n");
    exit(1);
    }
     
    //设置要绑定的地址
    bzero(&server_addr, sizeof(struct sockaddr_in));//清零
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(portnum);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     
    //绑定地址
    bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr_in));
     
    //监听端口
    listen(sockfd, 5);;
     
    while(1)
    {
    //等待连接
    sin_size = sizeof(struct sockaddr);
    new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size);
     
    printf("server get connect from %s\n", inet_ntoa(client_addr.sin_addr));
     
    //创建子进程,由子进程处理数据通讯
    if(pid = fork() == 0)
    {
        nbyte = recv(new_fd, buffer, 128, 0);
        buffer[nbyte] = '\0';
     
            printf("server received %s \n", buffer);
             
            close(new_fd);
            close(sockfd);
            exit(0);
    }
   
    else if(pid < 0)
        printf("fork error!\n");
     
    //结束连接
//     close(new_fd);
    }
 
    close(sockfd);
     
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值