搜索
bottom↓
回复: 12

寻找一个能转发的TCP服务器程序

[复制链接]

出0入0汤圆

发表于 2014-10-11 12:41:07 | 显示全部楼层 |阅读模式
设备1和设备2都能通过网络(外网)连接这个TCP服务器程序,然后这个服务器能把设备1的数据转发给设备2,同样设备2的数据转发给设备1,有没有这样功能的程序工具吖

出0入0汤圆

 楼主| 发表于 2014-10-11 12:43:29 | 显示全部楼层
我这里有一个固定的IP地址 IP: 123.157.xxx.xxx浙江省金华市 联通 想用来当服务器转发有些数据

出0入0汤圆

发表于 2014-10-11 12:57:16 | 显示全部楼层
自己开发一个呗。或者你可以看看turnserver

出0入0汤圆

发表于 2014-10-11 13:03:47 | 显示全部楼层
Linux还是哪里,Linux的我在网上找了一个:
  1. /*************************************************
  2. * File name   : server.c
  3. * Description : 单进程并发服务器
  4. * Author      : sg131971@qq.com
  5. * Version     : V1.0
  6. * Date        :
  7. * Compiler    : arm-linux-gcc-4.4.3
  8. * Target      : mini2440(Linux-2.6.32)
  9. * History     :
  10. *   <author>  <time>   <version >   <desc>
  11. *************************************************/
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <unistd.h>
  15. #include <sys/types.h>
  16. #include <sys/socket.h>
  17. #include <netinet/in.h>
  18. #include <arpa/inet.h>
  19. #include <sys/time.h>
  20. #include <stdlib.h>

  21. #define PORT 1234               //服务器端口
  22. #define BACKLOG 5               //listen队列中等待的连接数
  23. #define MAXDATASIZE 1024        //缓冲区大小

  24. typedef struct _CLIENT
  25. {
  26.     int fd;                     //客户端socket描述符
  27.     char name[20];              //客户端名称
  28.     struct sockaddr_in addr;    //客户端地址信息结构体
  29.     char data[MAXDATASIZE];     //客户端私有数据指针
  30. } CLIENT;

  31. void process_client(CLIENT * client, char *recvbuf, int len);   //客户请求处理函数

  32. /*************************************************
  33. * Function    : main()
  34. * Description :
  35. * Calls       : process_client()
  36. * Called By   :
  37. * Input       :
  38. * Output      :
  39. * Return      :
  40. *************************************************/
  41. void main(int argc ,char **argv)
  42. {
  43.     int i, maxi, maxfd, sockfd;
  44.     int nready;
  45.     ssize_t n;
  46.     fd_set rset, allset;        //select所需的文件描述符集合
  47.     int listenfd, connectfd;    //socket文件描述符
  48.     struct sockaddr_in server;  //服务器地址信息结构体

  49.     CLIENT client[FD_SETSIZE];  //FD_SETSIZE为select函数支持的最大描述符个数
  50.     char recvbuf[MAXDATASIZE];  //缓冲区
  51.     int sin_size;               //地址信息结构体大小

  52.     if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  53.     {                           //调用socket创建用于监听客户端的socket
  54.         perror("Creating socket failed.");
  55.         exit(1);
  56.     }

  57.     int opt = SO_REUSEADDR;
  58.     setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));  //设置socket属性

  59.     bzero(&server, sizeof(server));
  60.     server.sin_family = AF_INET;
  61.     server.sin_port = htons(PORT);
  62.     server.sin_addr.s_addr = htonl(INADDR_ANY);

  63.     if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
  64.     {                           //调用bind绑定地址
  65.         perror("Bind error.");
  66.         exit(1);
  67.     }

  68.     if (listen(listenfd, BACKLOG) == -1)
  69.     {                           //调用listen开始监听
  70.         perror("listen() error\n");
  71.         exit(1);
  72.     }

  73.     //初始化select
  74.     maxfd = listenfd;
  75.     maxi = -1;
  76.     for (i = 0; i < FD_SETSIZE; i++)
  77.     {
  78.         client[i].fd = -1;
  79.     }
  80.     FD_ZERO(&allset);           //清空
  81.     FD_SET(listenfd, &allset);  //将监听socket加入select检测的描述符集合

  82.     while (1)
  83.     {
  84.         struct sockaddr_in addr;
  85.         rset = allset;
  86.         nready = select(maxfd + 1, &rset, NULL, NULL, NULL);    //调用select
  87.       //  printf("Select() break and the return num is %d. \n", nready);

  88.         if (FD_ISSET(listenfd, &rset))
  89.         {                       //检测是否有新客户端请求
  90.             printf("Accept a connection.\n");
  91.             //调用accept,返回服务器与客户端连接的socket描述符
  92.             sin_size = sizeof(struct sockaddr_in);
  93.             if ((connectfd =
  94.                  accept(listenfd, (struct sockaddr *)&addr, (socklen_t *) & sin_size)) == -1)
  95.             {
  96.                 perror("Accept() error\n");
  97.                 continue;
  98.             }

  99.             //将新客户端的加入数组
  100.             for (i = 0; i < FD_SETSIZE; i++)
  101.             {
  102.                 if (client[i].fd < 0)
  103.                 {
  104.                     char buffer[20];
  105.                     client[i].fd = connectfd;   //保存客户端描述符
  106.                     memset(buffer, '0', sizeof(buffer));
  107.                     sprintf(buffer, "Client[%.2d]", i);
  108.                     memcpy(client[i].name, buffer, strlen(buffer));
  109.                     client[i].addr = addr;
  110.                     memset(buffer, '0', sizeof(buffer));
  111.                     sprintf(buffer, "Only For Test!");
  112.                     memcpy(client[i].data, buffer, strlen(buffer));
  113.                     printf("You got a connection from %s:%d.\n", inet_ntoa(client[i].addr.sin_addr),ntohs(client[i].addr.sin_port));
  114.                     printf("Add a new connection:%s\n",client[i].name);
  115.                     break;
  116.                 }
  117.             }
  118.             
  119.             if (i == FD_SETSIZE)
  120.                 printf("Too many clients\n");
  121.             FD_SET(connectfd, &allset); //将新socket连接放入select监听集合
  122.             if (connectfd > maxfd)
  123.                 maxfd = connectfd;  //确认maxfd是最大描述符
  124.             if (i > maxi)       //数组最大元素值
  125.                 maxi = i;
  126.             if (--nready <= 0)
  127.                 continue;       //如果没有新客户端连接,继续循环
  128.         }

  129.         for (i = 0; i <= maxi; i++)
  130.         {
  131.             if ((sockfd = client[i].fd) < 0)    //如果客户端描述符小于0,则没有客户端连接,检测下一个
  132.                 continue;
  133.             // 有客户连接,检测是否有数据
  134.             if (FD_ISSET(sockfd, &rset))
  135.             {
  136.               //  printf("Receive from connect fd[%d].\n", i);
  137.                 if ((n = recv(sockfd, recvbuf, MAXDATASIZE, 0)) == 0)
  138.                 {               //从客户端socket读数据,等于0表示网络中断
  139.                     close(sockfd);  //关闭socket连接
  140.                     printf("%s closed. User's data: %s\n", client[i].name, client[i].data);
  141.                     FD_CLR(sockfd, &allset);    //从监听集合中删除此socket连接
  142.                     client[i].fd = -1;  //数组元素设初始值,表示没客户端连接
  143.                 }
  144.                 else
  145.                                 {
  146.                                
  147.                                 }
  148.                    // process_client(&client[i], recvbuf, n); //接收到客户数据,开始处理
  149.                 if (--nready <= 0)
  150.                     break;      //如果没有新客户端有数据,跳出for循环回到while循环
  151.             }
  152.         }
  153.     }
  154.     close(listenfd);            //关闭服务器监听socket     
  155. }

  156. /*************************************************
  157. * Function    : process_client()
  158. * Description : 处理客户端连接函数
  159. * Calls       :
  160. * Called By   : main()
  161. * Input       :
  162. * Output      :
  163. * Return      :
  164. *************************************************/
  165. void process_client(CLIENT * client, char *recvbuf, int len)
  166. {
  167.     char sendbuf[MAXDATASIZE];
  168.     int i;

  169.   //  printf("Received client( %s ) message: %s\n", client->name, recvbuf);
  170.    
  171.     for (i = 0; i < len - 1; i++)
  172.     {
  173.         sendbuf[i] = recvbuf[len - i - 2];
  174.     }
  175.    
  176.     sendbuf[len - 1] = '\0';

  177.     send(client->fd, sendbuf, strlen(sendbuf), 0);
  178. }
复制代码

出0入0汤圆

发表于 2014-10-11 13:08:02 | 显示全部楼层
简单改一下就可以用了。

出0入16汤圆

发表于 2014-10-12 08:19:28 来自手机 | 显示全部楼层
标记学习

出0入0汤圆

发表于 2014-10-12 08:31:15 | 显示全部楼层
这个很简单吧。

出0入89汤圆

发表于 2014-10-12 08:39:58 来自手机 | 显示全部楼层
自已开发一个吧,不复杂。

出0入89汤圆

发表于 2014-10-12 08:41:43 来自手机 | 显示全部楼层
还有,在协议上圹充点会更好

出0入0汤圆

 楼主| 发表于 2014-10-13 08:18:47 | 显示全部楼层
学习了 谢谢吖

出0入0汤圆

发表于 2014-11-4 20:58:09 | 显示全部楼层
yeelink不就是实现这样的功能?

出0入0汤圆

 楼主| 发表于 2014-11-6 09:27:14 | 显示全部楼层
wdluo 发表于 2014-11-4 20:58
yeelink不就是实现这样的功能?

我刚好有个固定地址,想用自己的服务器

出0入0汤圆

发表于 2015-1-22 17:33:17 | 显示全部楼层
jianplx 发表于 2014-11-6 09:27
我刚好有个固定地址,想用自己的服务器

fuhome  有设备转设备的API,不过是UDP,自己验证就没事,现在UDP也基本不会掉包了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 02:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表