无法通过公共IP连接到我自己的机器

我不知道为什么我不能通过我的公共IP连接。 当使用本地IP它的作品。

我有适当的防火墙端口例外,我的路由器NAT具有端口转发到我的机器的configuration。

这是一个相当基本的程序,可以通过我的本地IP连接,但使用公共的时候会“拒绝连接”。

任何帮助? (我也设置了一个nginx服务器,不能从公网IP访问,但通过本地工作)

客户:

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { sockaddr_in address; int res; int sfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (-1 == sfd) { perror("cannot create socket"); exit(EXIT_FAILURE); } memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_port = htons(6511); res = inet_pton(AF_INET, "201.93.179.98", &address.sin_addr); /* connect through public IP doesn't work */ //res = inet_pton(AF_INET, "192.168.1.71", &address.sin_addr); if (0 > res) { perror("error: first parameter is not a valid address family"); close(sfd); exit(EXIT_FAILURE); } else if (0 == res) { perror("char string (second parameter does not contain valid ipaddress)"); close(sfd); exit(EXIT_FAILURE); } if (-1 == connect(sfd, (sockaddr *)&address, sizeof(address))) { perror("connect failed"); close(sfd); exit(EXIT_FAILURE); } /* perform read write operations ... */ char msg[] = "Hello World"; write(sfd, (void *)msg, sizeof(msg)); printf("sent %s\n", msg); shutdown(sfd, SHUT_RDWR); close(sfd); return EXIT_SUCCESS; } 

服务器:

 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { sockaddr_in address; int sfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(-1 == sfd) { perror("can not create socket"); exit(EXIT_FAILURE); } memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_port = htons(6511); address.sin_addr.s_addr = inet_addr("192.168.1.71"); /* serve on given interface */ if(-1 == bind(sfd, (sockaddr *)&address, sizeof(address))) { perror("error bind failed"); close(sfd); exit(EXIT_FAILURE); } if(-1 == listen(sfd, 10)) { perror("error listen failed"); close(sfd); exit(EXIT_FAILURE); } for(;;) { int cfd = accept(sfd, NULL, NULL); if(0 > cfd) { perror("error accept failed"); close(sfd); exit(EXIT_FAILURE); } /* perform read write operations ... read(cfd,buff,size)*/ char msg[100] = {}; read(cfd, (void *)msg, sizeof(msg)); printf("got %s\n", msg); if (-1 == shutdown(cfd, SHUT_RDWR)) { perror("can not shutdown socket"); close(cfd); close(sfd); exit(EXIT_FAILURE); } close(cfd); } close(sfd); return EXIT_SUCCESS; } 

您需要configuration您的路由器/防火墙以允许NAT发夹 。 如果你有一个SOHO路由器,它可能不支持这个。 如果您拥有思科ASA之类的东西,则应阅读文档。