加入fork()的区别(执行结果)

本文对比了两个简单的TCP服务器代码实现,其中一个使用了fork()创建子进程来处理客户端请求,另一个则没有。通过对比执行结果,展示了如何利用fork()提高服务器的并发处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加入fork()的区别(执行结果)

server2.c

#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc,char **argv){
  int sockfd;
  sockfd = socket(AF_INET,SOCK_STREAM,0);
  struct sockaddr_in sin;
  sin.sin_family=AF_INET;
  sin.sin_port = htons(8000);
  sin.sin_addr.s_addr = htonl(INADDR_ANY);
  //配置本地信息,使socket与本机地址及端口号绑定
  bind(sockfd,(struct sockaddr *)&sin,sizeof(sin));
  perror("bind");
  //监听并建立输入队列,限制最大请求数
  listen(sockfd,10);
  perror("listen");

  struct sockaddr_in pin;
  int address_size = sizeof(pin);
  int temp_sockfd;
  char *msg="Hello!";

  while(1){
    printf("accept……sockfd %d\n",sockfd);
    //接收连接请求,建立一个新socket
    temp_sockfd = accept(sockfd,(struct sockaddr *)&pin,&address_size);
    printf("accept……temp_sockfd %d\n",temp_sockfd);
    //在新socket上进行数据传输
    if(send(temp_sockfd,msg,strlen(msg),0)==-1){
      perror("send");
      exit(1);
    }
    //建立子进程
    if(!fork()){
       //接收客户端的信息
       char recvserver[256];
       memset(recvserver,0,256);
       printf("%s %d\n",recvserver,strlen(recvserver));
       recv(temp_sockfd,recvserver,sizeof(recvserver),0);
       printf("%s %d\n",recvserver,strlen(recvserver));
       close(temp_sockfd);
       exit(0);
   }
    close(temp_sockfd);
   }
}
    

 server3.c(不加fork)

#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc,char **argv){
  int sockfd;
  sockfd = socket(AF_INET,SOCK_STREAM,0);
  struct sockaddr_in sin;
  sin.sin_family=AF_INET;
  sin.sin_port = htons(8000);
  sin.sin_addr.s_addr = htonl(INADDR_ANY);
  bind(sockfd,(struct sockaddr *)&sin,sizeof(sin));
  perror("bind");
  listen(sockfd,10);
  perror("listen");
  struct sockaddr_in pin;
  int address_size = sizeof(pin);
  int temp_sockfd;
  char *msg="Hello!";

  while(1){
    printf("accept……sockfd %d\n",sockfd);
    temp_sockfd = accept(sockfd,(struct sockaddr *)&pin,&address_size);
    printf("accept……temp_sockfd %d\n",temp_sockfd);
    if(send(temp_sockfd,msg,strlen(msg),0)==-1){
     perror("send");
     exit(1);
    }
    
    //接收客户端的信息
    char recvserver[256];
    memset(recvserver,0,256);
     printf("%s %d\n",recvserver,strlen(recvserver));
    recv(temp_sockfd,recvserver,sizeof(recvserver),0);
   printf("%s %d\n",recvserver,strlen(recvserver));
    close(temp_sockfd);
   }
}
    

 执行结果:

[wangcm@wang socket]$ ./server3
bind: Success
listen: Success
accept……sockfd 3
accept……temp_sockfd 4
 0
server,hello!I am client! 25
accept……sockfd 3


[wangcm@wang socket]$ ./server2
bind: Success
listen: Success
accept……sockfd 3
accept……temp_sockfd 4
accept……sockfd 3
 0
server,hello!I am client! 25

 

客户端:client2.c

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char **argv){
 char *host_name="127.0.0.1";
 struct hostent *server_host_name;
 server_host_name=gethostbyname(host_name);
 
 int sockfd;
 //建立socket
 sockfd=socket(AF_INET,SOCK_STREAM,0);
 struct sockaddr_in pin;
 pin.sin_family=AF_INET;
 pin.sin_addr.s_addr = ((struct in_addr *)(server_host_name->h_addr))->s_addr;
 pin.sin_port=htons(8000);
 //建立连接,之前先赋值
 connect(sockfd,(struct sockaddr *)&pin,sizeof(pin));
 perror("send"); 
 char buffer[256];
 //memset()是内存赋值函数,用来给某一内存空间赋值,
 //memset(void* _dst,int val,int len),_dst是目标起始地址,val是要赋的值,len要赋值的字节数
 memset(buffer,0,256);
 printf("%s %d\n",buffer,strlen(buffer));
 //接收数据
 recv(sockfd,buffer,sizeof(buffer),0);
 printf("%s %d\n",buffer,strlen(buffer));
 
 //传输数据
 char *sendserver="server,hello!I am client!";
 if(send(sockfd,sendserver,strlen(sendserver),0)==-1){
   perror("send");
   exit(1);
 }
 close(sockfd);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值