IT评测·应用市场-qidao123.com技术社区

标题: 0812|TCP和UDP跨主机通讯 [打印本页]

作者: 络腮胡菲菲    时间: 2024-8-13 18:16
标题: 0812|TCP和UDP跨主机通讯
头脑导图

TCP实现跨主机通讯


服务器端

  1. #include<myhead.h>
  2. #define SER_PORT 6666 //端口号
  3. #define SER_IP "192.168.0.108" //服务器IP
  4. int main(int argc, const char *argv[])
  5. {
  6.         //创建套接字文件
  7.         int sfd = socket(AF_INET,SOCK_STREAM,0);
  8.         if(sfd == -1)
  9.         {
  10.                 perror("socket error");
  11.                 return -1;
  12.         }
  13.         printf("socket success\n");
  14.         //端口快速重用
  15.         int reuse = 1;
  16.         if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
  17.         {
  18.                 perror("setsockopt error");
  19.                 return -1;
  20.         }
  21.         //绑定
  22.         struct sockaddr_in sin;
  23.         sin.sin_family = AF_INET;   //通信域
  24.         sin.sin_port = htons(SER_PORT); //端口号
  25.         sin.sin_addr.s_addr = inet_addr(SER_IP); //服务器IP地址
  26.         if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
  27.         {
  28.                 perror("bind error");
  29.                 return -1;
  30.         }
  31.         printf("bind success\n");
  32.         //监听
  33.         if(listen(sfd,128)==-1)
  34.         {
  35.                 perror("listen error");
  36.                 return -1;
  37.         }
  38.         printf("listen success\n");
  39.         //接收客户端
  40.         int newfd = -1;
  41.         struct sockaddr_in cin;
  42.         socklen_t addrlen = sizeof(cin);
  43.         if((newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen))==-1)
  44.         {
  45.                 perror("accept error");
  46.                 return -1;
  47.         }
  48.         printf("监听到客户端\n");
  49.         //数据收发
  50.         char buf[128] = "";
  51.         while(1)
  52.         {
  53.                 //清空内容
  54.                 bzero(&buf,sizeof(buf));
  55.                 //接收客户端消息
  56.                 int res = recv(newfd,buf,sizeof(buf),0);
  57.                 if(res == -1)
  58.                 {
  59.                         perror("recv error");
  60.                         return -1;
  61.                 }else if(res = 0||strcmp(buf,"quit")==0)
  62.                 {
  63.                         printf("客户端已退出\n");
  64.                         close(newfd);
  65.                         break;
  66.                 }
  67.                 printf("[%s:%d]接收到的消息为:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
  68.                 //向客户端回复消息
  69.                 printf("请输入你的回复\n");
  70.                 bzero(&buf,sizeof(buf));
  71.                 fgets(buf,sizeof(buf),stdin);
  72.                 buf[strlen(buf)-1] = 0;
  73.                 send(newfd,buf,strlen(buf),0);
  74.                 printf("发送成功\n");
  75.         }
  76.         //关闭文件
  77.         close(sfd);
  78.         return 0;
  79. }
复制代码
客户端

  1. ubuntu@ubuntu:test$ cat 02tcpcil.c
  2. #include<myhead.h>
  3. #define SER_PORT 6666
  4. #define SER_IP  "192.168.0.108"
  5. #define CIL_PORT 8888
  6. #define CIL_IP "192.168.0.108"
  7. int main(int argc, const char *argv[])
  8. {
  9.         //创建用于通信的套接字文件
  10.         int cfd = -1;
  11.         if((cfd = socket(AF_INET,SOCK_STREAM,0))==-1)
  12.         {
  13.                 perror("socket error");
  14.                 return -1;
  15.         }
  16.         printf("socket success\n");
  17.         //端口号快速重用
  18.         int reuse = 1;
  19.         if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
  20.         {
  21.                 perror("setsockopt error");
  22.                 return -1;
  23.         }
  24.         //绑定ip和端口号
  25.         struct sockaddr_in cin;
  26.         cin.sin_family = AF_INET;
  27.         cin.sin_port = htons(CIL_PORT);
  28.         cin.sin_addr.s_addr = inet_addr(CIL_IP);
  29.         if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
  30.         {
  31.                 perror("bind error");
  32.                 return -1;
  33.         }
  34.         printf("bind success\n");
  35.         //链接到服务器
  36.         struct sockaddr_in sin;
  37.         sin.sin_family = AF_INET;
  38.         sin.sin_port = htons(SER_PORT);
  39.         sin.sin_addr.s_addr = inet_addr(SER_IP);
  40.         if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
  41.         {
  42.                 perror("connect error");
  43.                 return -1;
  44.         }
  45.         printf("连接到服务器\n");
  46.         //收发信息
  47.         char buf[128] = "";
  48.         while(1)
  49.         {
  50.                 //向服务端输入消息
  51.                 printf("请输入>>>");
  52.                 fgets(buf,sizeof(buf),stdin);
  53.                 buf[strlen(buf)-1] = 0;
  54.                 send(cfd,buf,strlen(buf),0);
  55.                 if(strcmp(buf,"quit")==0)
  56.                 {
  57.                         break;
  58.                 }
  59.                 //清空容器
  60.                 bzero(&buf,sizeof(buf));
  61.                 //接收服务器消息
  62.                 recv(cfd,buf,sizeof(buf),0);
  63.                 printf("%s\n",buf);
  64.         }
  65.         //关闭文件
  66.         close(cfd);
  67.         return 0;
  68. }
复制代码
UDP实现跨主机通讯

服务器端

  1. #include<myhead.h>
  2. #define SER_PORT 7777   //服务器端口号
  3. #define SER_IP "192.168.0.128" //服务器ip地址
  4. int main(int argc, const char *argv[])
  5. {
  6.         //创建套接字文件
  7.         int sfd = socket(AF_INET,SOCK_DGRAM,0);
  8.         if(sfd == -1)
  9.         {
  10.                 perror("socket error");
  11.                 return -1;
  12.         }
  13.         printf("sfd = %d\n",sfd);   //3
  14.         //将端口号快速重用
  15.         int reuse = 1;
  16.         if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
  17.         {
  18.                 perror("setsockopt error");
  19.                 return -1;
  20.         }
  21.         printf("端口号快速重用成功\n");
  22.         //绑定IP地址和端口号
  23.         //填充地址信息结构体
  24.         struct sockaddr_in sin;
  25.         sin.sin_family = AF_INET;                    //通信域
  26.         sin.sin_port = htons(SER_PORT);              //端口号
  27.         sin.sin_addr.s_addr = inet_addr(SER_IP);     //ip地址
  28.         //绑定工作
  29.         if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
  30.         {
  31.                 perror("bind error");
  32.                 return -1;
  33.         }
  34.         printf("bind success\n");
  35.         //数据收发
  36.         char buf[128] = "";
  37.         struct sockaddr_in cin;            //接受对端地址信息
  38.         socklen_t addrlen = sizeof(cin);   //接受地址长度
  39.         while(1)
  40.         {
  41.                 //清空容器
  42.                 bzero(buf,sizeof(buf));
  43.                 //从套接字中读取数据
  44.                 recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);
  45.                 printf("收到消息为:%s\n",buf);
  46.                 strcat(buf,"*==*");
  47.                 if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&cin,sizeof(cin))==-1)
  48.                 {
  49.                         perror("sendto error");
  50.                         return -1;
  51.                 }
  52.                 printf("发送成功\n");
  53.         }
  54.         //关闭文件描述符
  55.         close(sfd);
  56.         return 0;
  57. }
复制代码
客户端

  1. #include<myhead.h>
  2. #define SER_PORT 7777   //服务器端口号
  3. #define SER_IP "192.168.0.128" //服务器ip地址
  4. #define CLI_PORT 5555   //客户端端口号
  5. #define CLI_IP "192.168.0.128" //客户端地址
  6. int main(int argc, const char *argv[])
  7. {
  8.         //创建套接字文件
  9.         int cfd = socket(AF_INET,SOCK_DGRAM,0);
  10.         if(cfd == -1)
  11.         {
  12.                 perror("socket error");
  13.                 return -1;
  14.         }
  15.         printf("cfd = %d\n",cfd);   //3
  16.         //将端口号快速重用
  17.         int reuse = 1;
  18.         if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
  19.         {
  20.                 perror("setsockopt error");
  21.                 return -1;
  22.         }
  23.         printf("端口号快速重用成功\n");
  24.         //绑定IP地址和端口号
  25.         //填充地址信息结构体
  26.         struct sockaddr_in cin;
  27.         cin.sin_family = AF_INET;                    //通信域
  28.         cin.sin_port = htons(CLI_PORT);              //端口号
  29.         cin.sin_addr.s_addr = inet_addr(CLI_IP);     //ip地址
  30.         //绑定工作
  31.         if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
  32.         {
  33.                 perror("bind error");
  34.                 return -1;
  35.         }
  36.         printf("bind success\n");
  37.         //数据收发
  38.         char buf[128] = "";
  39.         struct sockaddr_in sin;            //接受对端地址信息
  40.         sin.sin_family = AF_INET;
  41.         sin.sin_port = htons(SER_PORT);
  42.         sin.sin_addr.s_addr = inet_addr(SER_IP);
  43.         while(1)
  44.         {
  45.                 //清空容器
  46.                 bzero(buf,sizeof(buf));
  47.                 //从终端获取数据
  48.                 printf("请输入>>>>");
  49.                 fgets(buf,sizeof(buf),stdin);
  50.                 buf[strlen(buf)-1] = 0;
  51.                 //将数据发送给服务器
  52.                 sendto(cfd,buf,strlen(buf),0,(struct sockaddr*)&sin,sizeof(sin));
  53.                 printf("发送成功\n");
  54.                 //清空容器
  55.                 bzero(buf,sizeof(buf));
  56.                 //接受服务器发来的消息
  57.                 recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
  58.                 printf("收到来自服务器的消息:%s\n",buf);
  59.         }
  60.         //关闭文件描述符
  61.         close(cfd);
  62.         return 0;
  63. }
复制代码


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




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4