ITPub博客

首页 > Linux操作系统 > Linux操作系统 > tcp_server_fork.c

tcp_server_fork.c

原创 Linux操作系统 作者:deebug 时间:2014-12-22 20:57:58 0 删除 编辑
TCP循环服务器
TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接。算法如下:
socket(...);
bind(...); 
listen(...); 
while(1)
{ 
accept(...); 
process(...); 
close(...);
} 

TCP循环服务器一次只能处理一个客户端的请求。只有在这个客户的所有请求都满足后, 服务器才可以继续后面的请求。这样如果有一个客户端占住服务器不放时,其它的客户机都不能工作了,因此,TCP服务器一般很少用循环服务器模型的

TCP并发服务器 
并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理。算法如下:
socket(...); 
bind(...); 
listen(...); 
while(1) { 
accept(...); 
if(fork(..)==0) { 
process(...); 
close(...); 
exit(...); 
} 
close(...); 
} 
TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况。但同时也带来了问题:为了响应客户的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作

 
#include
#include
#include
#include
#include
#include
#include
#include
#define MY_PORT 3333
int main(int argc ,char **argv)
{
 int listen_fd,accept_fd;
 struct sockaddr_in     client_addr;
 int n;
 int nbytes;
 
  if((listen_fd=socket(AF_INET,SOCK_STREAM,0))<0)
   {
         printf("Socket Error:%s\n\a",strerror(errno));
         exit(1);
   }
 
  bzero(&client_addr,sizeof(struct sockaddr_in));
  client_addr.sin_family=AF_INET;
  client_addr.sin_port=htons(MY_PORT);
  client_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  n=1;
 
  /* 如果服务器终止后,服务器可以第二次快速启动而不用等待一段时间  */
  setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(int));
  if(bind(listen_fd,(struct sockaddr *)&client_addr,sizeof(client_addr))<0)
   {
         printf("Bind Error:%s\n\a",strerror(errno));
         exit(1);
   }
 
   listen(listen_fd,5);
   
   while(1)
   {
     accept_fd=accept(listen_fd,NULL,NULL);
     if((accept_fd<0)&&(errno==EINTR))
            continue;
     else if(accept_fd<0)
      {
          printf("Accept Error:%s\n\a",strerror(errno));
          continue;
      }
    if((n=fork())==0)
     {
          /* 子进程处理客户端的连接 */
          char buffer[1024];
          if((nbytes=read(accept_fd,buffer,1024))==-1)
   {
    fprintf(stderr,"Read Error:%s\n",strerror(errno));
    exit(1);
   }   
   buffer[nbytes]='\0';
   printf("Server received %s\n",buffer);
          
          close(listen_fd);
          close(accept_fd);
          exit(0);
     }
     else
      close(accept_fd);
 }
}

Edit by Deebug20130310

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29517383/viewspace-1376516/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: udp_client.c
下一篇: tcp_server.c
请登录后发表评论 登录
全部评论

注册时间:2014-03-03

  • 博文量
    51
  • 访问量
    69442