免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2622 | 回复: 1
打印 上一主题 下一主题

[网络] 双socket分别bind两个公网IP地址,只有一个能做TCP连接,另一个失败。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-07 12:01 |只看该作者 |倒序浏览
想搭个Xstunt server做P2P穿透, 需要一个服务器有两个公网IP(A和B),发现建立连接的时候还是失败。后来发现第2个IP地址(B)的TCP 3次握手不成功。大概看了它的源码,程序是创建两个socket分别bind在这两个公网IP上。

后来我自己写了个简单的程序,创建两个TCP socket,分别bind这两个公网IP地址。结果从远程连这个服务器,发现还真的只有其中一个IP能连得上,另一个会超时。我已经在服务器上用netstat -ntlp命令来查看,的确是两个IP在监听。

注:我的测试客户端是用命令“nc <IP> <ORT>"来做测试的。

另外:如果是直接在服务器上来连这两个socket是都可以成功的,就是从远程来连就不行。谁能指导下?

把服务器程序放在windows下的cygwin下测试同样的结果。

我的服务器代码如下:(代码纯属测试,没有很认真写,但能运作,望见谅)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <sys/socket.h>
  8. #include <sys/wait.h>
  9. #include <arpa/inet.h>
  10. #include <unistd.h>
  11. #define SERVPORT 3333 /*服务器监听端口号 */
  12. #define BACKLOG 10 /* 最大同时连接请求数 */

  13. int main(int argc, char **argv)
  14. {
  15.   int sockfd[2],client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
  16.   struct sockaddr_in my_addr; /* 本机地址信息 */
  17.   struct sockaddr_in remote_addr; /* 客户端地址信息 */
  18.   int sin_size;
  19.   int maxfd;
  20.   fd_set rfds;
  21.   int i;

  22.   if(argc != 3)
  23.     {   
  24.       printf("Usage: %s <IP_1> <IP_2>\n", argv[0]);
  25.       return 1;
  26.     }   
  27.   for(i = 0; i < 2; i++)
  28.   {
  29.     if ((sockfd[i] = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  30.       perror("socket创建出错!"); exit(1);
  31.     }   
  32.     else
  33.     {   
  34.       printf("Create sockfd[%d] = %d\n", i, sockfd[i]);
  35.   }
  36.   }

  37.   // set the first Socket
  38.   my_addr.sin_family=AF_INET;
  39.   my_addr.sin_port=htons(SERVPORT);
  40.   my_addr.sin_addr.s_addr = inet_addr(argv[1]);
  41.   bzero(&(my_addr.sin_zero),8);

  42.   if (bind(sockfd[0], (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
  43.     perror("bind出错!");
  44.     exit(1);
  45.   }

  46.   // set the second Socket
  47.   my_addr.sin_family=AF_INET;
  48.   my_addr.sin_port=htons(SERVPORT);
  49.   my_addr.sin_addr.s_addr = inet_addr(argv[2]);
  50.   bzero(&(my_addr.sin_zero),8);
  51.   if (bind(sockfd[1], (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
  52.     perror("bind出错!");
  53.     exit(1);
  54.   }

  55.   for(i = 0; i < 2; i++)
  56.   {
  57.     if (listen(sockfd[i], BACKLOG) == -1) {
  58.       perror("listen出错!");
  59.       exit(1);
  60.     }
  61.   }

  62.   if(sockfd[0] > sockfd[1])
  63.    maxfd = sockfd[0];
  64.   else
  65.     maxfd = sockfd[1];

  66.   while(1) {

  67.     FD_ZERO(&rfds);
  68.     FD_SET(sockfd[0], &rfds);
  69.     FD_SET(sockfd[1], &rfds);

  70.     printf("waiting client\n");
  71.     select(maxfd + 1, &rfds, NULL, NULL, NULL);

  72.     sin_size = sizeof(struct sockaddr_in);
  73.     if(FD_ISSET(sockfd[0], &rfds))
  74.     {
  75.       printf("sockfd[0](%s) is readable\n", argv[1]);

  76.       if ((client_fd = accept(sockfd[0], (struct sockaddr *)&remote_addr, (socklen_t *)&sin_size)) == -1) {
  77.         perror("accept出错");
  78.         continue;
  79.       }
  80.     }
  81.     else if(FD_ISSET(sockfd[1], &rfds))
  82.     {
  83.       printf("sockfd[1](%s) is readable\n", argv[2]);
  84.       if ((client_fd = accept(sockfd[1], (struct sockaddr *)&remote_addr, (socklen_t *)&sin_size)) == -1) {
  85.         perror("accept出错");
  86.         continue;
  87.       }
  88.     }
  89.     else
  90.     {
  91.       printf("select error\n");
  92.       continue;
  93.     }

  94.     printf("received a connection from %s:%d\n\n", (char *)inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port));
  95.     if (!fork()) { /* 子进程代码段 */
  96.         if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1)
  97.           perror("send出错!");
  98.       //  sleep(10);
  99.         close(client_fd);
  100.         exit(0);
  101.     }   
  102.     close(client_fd);
  103.    }
  104. }
复制代码

论坛徽章:
4
申猴
日期:2013-08-23 12:42:13双鱼座
日期:2013-09-30 08:41:52摩羯座
日期:2013-10-29 07:47:43处女座
日期:2013-12-01 11:31:30
2 [报告]
发表于 2013-06-09 23:40 |只看该作者
经测试,是没有问题的。你的服务器的B ip地址配置有可能错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP