ToB企服应用市场:ToB评测及商务社交产业平台

标题: 网络编程 day4~day5.1——多点通信,域套接字 [打印本页]

作者: 灌篮少年    时间: 2024-11-22 22:19
标题: 网络编程 day4~day5.1——多点通信,域套接字
条记脑图


作业:

1、将广播发送和接收端实现一遍,完成一个发送端发送信息,对应多个接收端接收信息实行。

接收端
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <myhead.h>
  4. #define IP "192.168.61.255"
  5. #define PORT 6666
  6. int main(int argc, const char *argv[])
  7. {
  8.         //创建
  9.         int oldfd=socket(AF_INET,SOCK_DGRAM,0);
  10.         if(oldfd==-1)
  11.         {
  12.                 perror("socket");
  13.                 return -1;
  14.         }
  15.         //绑定
  16.         struct sockaddr_in recv={
  17.                 .sin_family=AF_INET,
  18.                 .sin_port=htons(PORT),
  19.                 .sin_addr.s_addr=inet_addr(IP),
  20.         };
  21.         if(bind(oldfd,(struct sockaddr *)&recv,sizeof(recv))==-1)
  22.         {
  23.                 perror("bind");
  24.                 return -1;
  25.         }
  26.         //接收
  27.         char buff[1024];
  28.         while(1)
  29.         {
  30.                 recvfrom(oldfd,buff,sizeof(buff),0,NULL,NULL);
  31.                 printf("接收到%s发送来的消息:%s\n",inet_ntoa(recv.sin_addr),buff);
  32.                 if(strcmp(buff,"quit")==0)
  33.                 {
  34.                         printf("接收端退出\n");
  35.                         break;
  36.                 }
  37.         }
  38.         close(oldfd);
  39.         return 0;
  40. }
复制代码
发送端
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <myhead.h>
  4. #define IP "192.168.61.255"
  5. #define PORT 6666
  6. int main(int argc, const char *argv[])
  7. {
  8.         //创建
  9.         int oldfd=socket(AF_INET,SOCK_DGRAM,0);
  10.         if(oldfd==-1)
  11.         {
  12.                 perror("socket");
  13.                 return -1;
  14.         }
  15.         //允许广播
  16.         int n=1;
  17.         if(setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&n,sizeof(n))==-1)
  18.         {
  19.                 perror("setsockopt");
  20.                 return -1;
  21.         }
  22.         //结构体
  23.         struct sockaddr_in send={
  24.                 .sin_family=AF_INET,
  25.                 .sin_port=htons(PORT),
  26.                 .sin_addr.s_addr=inet_addr(IP)
  27.         };
  28.         //
  29.         char buff[1024];
  30.         while(1)
  31.         {
  32.                 bzero(buff,sizeof(buff));
  33.                 fgets(buff,sizeof(buff),stdin);
  34.                 buff[strlen(buff)-1]='\0';
  35.                 sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&send,sizeof(send));
  36.                 printf("发送成功\n");
  37.                 if(strcmp(buff,"quit")==0)
  38.                 {
  39.                         printf("发送端退出\n");
  40.                         break;
  41.                 }
  42.         }
  43.         close(oldfd);
  44.         return 0;
  45. }
复制代码

2、使用多线程基于TCP协议的并发执行,一个服务器对应多个客户端实现通信实行。

服务器
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <myhead.h>
  4. #define IP "192.168.60.44"
  5. #define PORT 6666
  6. #define BACKLOG 1024
  7. typedef struct
  8. {
  9.         struct sockaddr_in client;
  10.         int newfd;
  11. }stu;
  12. void *fun(void *sss)
  13. {
  14.         int newfd=((stu *)sss)->newfd;
  15.         struct sockaddr_in client=((stu *)sss)->client;
  16.         printf("%s发来消息\n",inet_ntoa(client.sin_addr));
  17.         char buff[1024];
  18.         while(1)
  19.         {
  20.                 int len=recv(newfd,buff,sizeof(buff),0);
  21.                 if(len==0)
  22.                 {
  23.                         printf("客户端退出\n");
  24.                         break;
  25.                 }
  26.                 printf("收到来自%s的消息:%s\n",inet_ntoa(client.sin_addr),buff);
  27.                 strcat(buff,"1973");
  28.                 send(newfd,buff,sizeof(buff),0);
  29.         }
  30.         pthread_exit(NULL);
  31. }
  32. int main(int argc, const char *argv[])
  33. {
  34.         int oldfd=socket(AF_INET,SOCK_STREAM,0);
  35.         if(oldfd==-1)
  36.         {
  37.                 perror("socket");
  38.                 return -1;
  39.         }
  40.         //
  41.         struct sockaddr_in server={
  42.                 .sin_family=AF_INET,
  43.                 .sin_port=htons(PORT),
  44.                 .sin_addr.s_addr=inet_addr(IP),
  45.         };
  46.         if(bind(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
  47.         {
  48.                 perror("bind");
  49.                 return -1;
  50.         }
  51.         //
  52.         if(listen(oldfd,BACKLOG)==-1)
  53.         {
  54.                 perror("listen");
  55.                 return -1;
  56.         }
  57.         struct sockaddr_in client;
  58.         socklen_t client_len=sizeof(client);
  59.         while(1)
  60.         {
  61.                 int newfd=accept(oldfd,(struct sockaddr *)&client,&client_len);
  62.                
  63.                 stu a;
  64.                 a.newfd=newfd;
  65.                 a.client=client;
  66.                 pthread_t tid;
  67.                 tid=pthread_create(&tid,NULL,fun,&a);
  68.                 if(tid==-1)
  69.                 {
  70.                         perror("pthread_create");
  71.                         return -1;
  72.                 }
  73.                 pthread_detach(tid);
  74.         }
  75.         return 0;
  76. }
复制代码
客户端
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <myhead.h>
  4. #define IP "192.168.60.44"
  5. #define PORT 6666
  6. int main(int argc, const char *argv[])
  7. {
  8.         //创建
  9.         int oldfd=socket(AF_INET,SOCK_STREAM,0);
  10.         if(oldfd==-1)
  11.         {
  12.                 perror("socket");
  13.                 return -1;
  14.         }
  15.         //连接服务器
  16.         struct sockaddr_in server={
  17.                 .sin_family=AF_INET,
  18.                 .sin_port=htons(PORT),
  19.                 .sin_addr.s_addr=inet_addr(IP),
  20.         };
  21.         if(connect(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
  22.         {
  23.                 perror("connect");
  24.                 return -1;
  25.         }
  26.         //循环收发
  27.         char buff[1024];
  28.         while(1)
  29.         {
  30.                 fgets(buff,sizeof(buff),stdin);
  31.                 buff[strlen(buff)-1]='\0';
  32.                 send(oldfd,buff,sizeof(buff),0);
  33.                 int len=recv(oldfd,buff,sizeof(buff),0);
  34.                 if(len==0)
  35.                 {
  36.                         printf("服务器意外退出\n");
  37.                         break;
  38.                 }
  39.                 printf("接收服务器的消息:%s\n",buff);
  40.         }
  41.         //关闭
  42.         close(oldfd);
  43.         return 0;
  44. }
复制代码




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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4