qidao123.com ToB IT社区-企服评测·应用市场

标题: 12月29日网络编程 [打印本页]

作者: 干翻全岛蛙蛙    时间: 2025-11-17 21:18
标题: 12月29日网络编程
作业:多进程多线程并发服务器实现一遍提交。
1.多进程
服务器
  1. #include <myhead.h>
  2. #define IP "192.168.124.40"
  3. #define PORT 9999
  4. void *fun(void *fd)
  5. {
  6.         int newfd=*(int *)fd;
  7.         char buff[1024];
  8.         while(1)
  9.         {
  10.                 int res=recv(newfd,buff,sizeof(buff),0);
  11.                 if(res==0)
  12.                 {
  13.                         printf("客户端下线\n");
  14.                         break;
  15.                 }
  16.                 printf("%s\n",buff);
  17.                 strcat(buff,"回家跨年");
  18.                 send(newfd,buff,sizeof(buff),0);
  19.         }
  20.         pthread_exit(NULL);//子线程退出
  21. }
  22. int main(int argc, const char *argv[])
  23. {
  24.         //1.创建套接字
  25.         int oldfd=socket(AF_INET,SOCK_STREAM,0);
  26.         if(oldfd==-1)
  27.         {
  28.                 perror("socket");
  29.                 return -1;
  30.         }
  31.         //端口号快速复用
  32.         int k=987;
  33.         if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&k,sizeof(k))==-1)
  34.         {
  35.                 perror("setsockopt");
  36.                 return -1;
  37.         }
  38.         printf("端口号复用成功\n");
  39.         //2.绑定服务器
  40.         struct sockaddr_in server={
  41.                 .sin_family=AF_INET,
  42.                 .sin_port=htons(PORT),
  43.                 .sin_addr.s_addr=inet_addr(IP)
  44.         };
  45.         if(bind(oldfd,(struct sockadr *)&server,sizeof(server))==-1)
  46.         {
  47.                 perror("bind");
  48.                 return -1;
  49.         }
  50.        
  51.         //3.服务器监听
  52.         if(listen(oldfd,20)==-1)//oldfd描述符最大可监听20个客户端的请求
  53.         {
  54.                 perror("listen");
  55.                 return -1;
  56.         }
  57.         //4.连接新的客户端
  58.         struct sockaddr_in client;
  59.         int client_len=sizeof(client);
  60.         while(1)
  61.         {
  62.                 int newfd=accept(oldfd,(struct sockaddr *)&client,&client_len)
  63.                 {
  64.                         perror("accept");
  65.                         return -1;
  66.                 }
  67.                 printf("连接客户端的信息:%s:%d",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
  68.                 //5.创建子父进程
  69.                 pid_t pid=fork();
  70.                 char buff[1024];
  71.                 if(pid>0)//父进程
  72.                 {
  73.                         if(signal(SIGCHLD,handle)==SIG_ERR)//绑定子进程退出新信号
  74.                         {
  75.                                 perror("signal");
  76.                                 return -1;
  77.                         }
  78.                         close(newfd);//父进程关闭新的描述符
  79.                 }
  80.                 else if(pid==0)
  81.                 {
  82.                         //子进程关闭旧描述符,收发信息
  83.                         close(oldfd);
  84.                         while(1)
  85.                         {
  86.                                 int res=recv(newfd,buff,sizeof(buff),0);//收客户端的消息
  87.                                 if(res==0)
  88.                                 {
  89.                                         printf("客户端已退出\n");
  90.                                         break;
  91.                                 }
  92.                                 printf("%s\n",buff);//输出收到的消息
  93.                                 strcat(buff,"枪出如龙");
  94.                                 send(newfd,buff,sizeof(buff),0);//向连接的客户端发送消息
  95.                         }
  96.                         exit(EXIT_SUCCESS);//子进程退出
  97.                 }
  98.                 else
  99.                 {
  100.                         perror("fork");
  101.                         return -1;
  102.                 }
  103.         }
  104.         close(oldfd);
  105.         return 0;
  106. }
复制代码
客户端
  1. #include <myhead.h>
  2. #define IP "192.168.124.40"
  3. #define SERPORT 9999
  4. int main(int argc, const char *argv[])
  5. {
  6.     //1、创建套接字
  7.     //2、绑定(不是必须绑定)
  8.     //3、连接
  9.     //4、收发消息
  10.    
  11.     int oldfd = socket(AF_INET,SOCK_STREAM,0);
  12.     if(oldfd==-1)
  13.     {
  14.         perror("socket");
  15.         return -1;
  16.     }
  17. #if 0
  18.     //绑定固定的IP和端口号(不是必须的)
  19.     struct sockaddr_in client = {
  20.         .sin_family  =AF_INET,
  21.         .sin_port = htons(7899),//自定义端口号
  22.         .sin_addr.s_addr = inet_addr("192.168.124.34")
  23.     };
  24.     if(bind(oldfd,(struct sockaddr *)&client,sizeof(client))==-1)
  25.     {
  26.         perror("bind");
  27.         return -1;
  28.     }
  29. #endif
  30.     //连接服务器
  31.     struct sockaddr_in server = {
  32.         .sin_family  =AF_INET,
  33.         .sin_port = htons(SERPORT),//注意端口号需要服务器端口
  34.         .sin_addr.s_addr = inet_addr(IP)
  35.     };
  36.    
  37.     if(connect(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
  38.     {
  39.         perror("connect");
  40.         return -1;
  41.     }
  42.     //收发消息
  43.     char buff[1024];
  44.     while(1)
  45.     {
  46.         fgets(buff,sizeof(buff),stdin);
  47.         buff[strlen(buff)-1] = '\0';
  48.         send(oldfd,buff,sizeof(buff),0);
  49.         if(strcmp(buff,"quit")==0)//退出客户端
  50.         {
  51.             break;
  52.         }
  53.         bzero(buff,sizeof(buff));
  54.         recv(oldfd,buff,sizeof(buff),0);//阻塞接收服务器消息
  55.         printf("服务器发来消息:%s\n",buff);
  56.     }
  57. close(oldfd);
  58.     return 0;
  59. }
复制代码
2.多线程
服务器
  1. #include <myhead.h>
  2. #define IP "192.168.124.34"
  3. #define PORT 8888
  4. void *fun(void *fd)
  5. {
  6.     int newfd = *(int *)fd;
  7.     char buff[1024];
  8.     while(1)
  9.     {
  10.         int res = recv(newfd,buff,sizeof(buff),0);
  11.         if(res==0)
  12.         {
  13.             printf("客户端下线\n");
  14.             break;
  15.         }
  16.         printf("%s\n",buff);
  17.         strcat(buff,"5点放学");
  18.         send(newfd,buff,sizeof(buff),0);
  19.     }
  20.     pthread_exit(NULL);//子线程退出
  21. }
  22. int main(int argc, const char *argv[])
  23. {
  24.     //创建套接字
  25.     int oldfd = socket(AF_INET,SOCK_STREAM,0);
  26.     if(oldfd==-1)
  27.     {
  28.         perror("socket");
  29.         return -1;
  30.     }
  31.     //绑定
  32.     struct sockaddr_in server = {
  33.         .sin_family  =AF_INET,
  34.         .sin_port = htons(PORT),
  35.         .sin_addr.s_addr  =inet_addr(IP)
  36.     };
  37.     if(bind(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
  38.     {
  39.         perror("bind");
  40.         return -1;
  41.     }
  42.     //监听
  43.     if(listen(oldfd,20)==-1)
  44.     {
  45.         perror("listen");
  46.         return -1;
  47.     }
  48.     struct sockaddr_in client;
  49.     int client_len = sizeof(client);
  50.     int newfd;
  51.     pthread_t tid;
  52.     while(1)
  53.     {
  54.         //接收新客户端连入请求
  55.         newfd = accept(oldfd,(struct sockaddr *)&client,&client_len);
  56.         if(newfd==-1)
  57.         {
  58.             perror("accept");
  59.             return -1;
  60.         }
  61.         //创建子线程与客户端通话
  62.         if(pthread_create(&tid,NULL,fun,&newfd)==-1)
  63.         {
  64.             perror("pthread_create");
  65.             return -1;
  66.         }
  67.     }
  68.     pthread_join(tid,NULL);//回收子线程资源
  69.     close(newfd);
  70.     close(oldfd);
  71.     return 0;
  72. }
复制代码
客户端
  1. #include <myhead.h>
  2. #define IP "192.168.124.34"
  3. #define SERPORT 8888
  4. int main(int argc, const char *argv[])
  5. {
  6.     //1、创建套接字
  7.     //2、绑定(不是必须绑定)
  8.     //3、连接
  9.     //4、收发消息
  10.    
  11.     int oldfd = socket(AF_INET,SOCK_STREAM,0);
  12.     if(oldfd==-1)
  13.     {
  14.         perror("socket");
  15.         return -1;
  16.     }
  17. #if 0
  18.     //绑定固定的IP和端口号(不是必须的)
  19.     struct sockaddr_in client = {
  20.         .sin_family  =AF_INET,
  21.         .sin_port = htons(7899),//自定义端口号
  22.         .sin_addr.s_addr = inet_addr("192.168.124.34")
  23.     };
  24.     if(bind(oldfd,(struct sockaddr *)&client,sizeof(client))==-1)
  25.     {
  26.         perror("bind");
  27.         return -1;
  28.     }
  29. #endif
  30.     //连接服务器
  31.     struct sockaddr_in server = {
  32.         .sin_family  =AF_INET,
  33.         .sin_port = htons(SERPORT),//注意端口号需要服务器端口
  34.         .sin_addr.s_addr = inet_addr(IP)
  35.     };
  36.    
  37.     if(connect(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
  38.     {
  39.         perror("connect");
  40.         return -1;
  41.     }
  42.     //收发消息
  43.     char buff[1024];
  44.     while(1)
  45.     {
  46.         fgets(buff,sizeof(buff),stdin);
  47.         buff[strlen(buff)-1] = '\0';
  48.         send(oldfd,buff,strlen(buff),0);
  49.         if(strcmp(buff,"quit")==0)//退出客户端
  50.         {
  51.             break;
  52.         }
  53.         bzero(buff,sizeof(buff));
  54.         recv(oldfd,buff,sizeof(buff),0);//阻塞接收服务器消息
  55.         printf("服务器发来消息:%s\n",buff);
  56.     }
  57.     return 0;
  58. }
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com ToB IT社区-企服评测·应用市场 (https://www.qidao123.com/bbs/) Powered by Discuz! X3.5