Socket远程连接问题C

发布于 2024-10-31 05:01:18 字数 1649 浏览 1 评论 0原文

我用 C 语言编写了一个简单的服务器应用程序。该服务器除了打印收到的消息然后退出之外什么都不做。 代码

int listenfd,connfd,n;
struct sockaddr_in servaddr,cliaddr;
socklen_t clilen;

char *mesg = (char*) malloc(1000*sizeof(char));

listenfd=socket(PF_INET,SOCK_STREAM,0);

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port=htons(20600);

bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

listen(listenfd,5);

clilen=sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);


n = (int) recvfrom(connfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&clilen);
sendto(connfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
printf("-------------------------------------------------------\n");
mesg[n] = 0;
printf("Received the following:\n");
printf("%s\n",mesg);
printf("-------------------------------------------------------\n");


close(connfd);
close(listenfd);

这是我设法使用 telnet 建立连接并运行的

telnet 192.168.1.2 20600

,其中 192.168.1.2 是服务器的本地 IP。 该机器在路由器 ZyXel p-660HW-61 (192.168.0.1) 后面运行。 问题是如果我指定机器的公共 IP (151.53.150.45),我无法访问服务器。 我将 NAT 配置设置为从 20000 到 21000 的所有端口上的服务器本地 ip http://img593.imageshack.us/img593/3959/schermata20110405a22492.png

根据 canyouseeme.org/ 和 yougetsignal.com/tools/open-ports/ ,端口 20600 似乎是开放的(事实上我可以在控制台中读取到已收到数据包),但是如果我运行,

telnet 151.53.150.45 20600

我会得到一个“Connection拒绝”错误。 路由器和服务器计算机(即运行的 telnet 相同)上的防火墙均已禁用。

有什么帮助吗?

I wrote a simple server application in C. This server do nothing except print the received message, then exit. Here is the code

int listenfd,connfd,n;
struct sockaddr_in servaddr,cliaddr;
socklen_t clilen;

char *mesg = (char*) malloc(1000*sizeof(char));

listenfd=socket(PF_INET,SOCK_STREAM,0);

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port=htons(20600);

bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

listen(listenfd,5);

clilen=sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);


n = (int) recvfrom(connfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&clilen);
sendto(connfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
printf("-------------------------------------------------------\n");
mesg[n] = 0;
printf("Received the following:\n");
printf("%s\n",mesg);
printf("-------------------------------------------------------\n");


close(connfd);
close(listenfd);

I managed to establish a connection using telnet and running

telnet 192.168.1.2 20600

where 192.168.1.2 is the local ip of the server.
The machine runs behind a router ZyXel p-660HW-61 (192.168.0.1).
The problem is I cannot reach the server if I specify the public ip of the machine (151.53.150.45).
I set NAT configuration to the server local ip on all port from 20000 to 21000
http://img593.imageshack.us/img593/3959/schermata20110405a22492.png

port 20600 seems to be open, according to canyouseeme.org/ and yougetsignal.com/tools/open-ports/ (in fact I can read in the console that a packet has been received), but if I run

telnet 151.53.150.45 20600

I get a "Connection Refused" error.
Firewall is disabled, both on the router and on the server machine (that is the same running telnet).

Any help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

晨与橙与城 2024-11-07 05:01:18

输入:

telnet 151.53.150.45 20600

如果您从 LAN 而不是从 WAN ,则您的 NAT 很可能无法正确处理发夹情况。这意味着它只希望您使用来自 WAN 的转换后的地址。

解决方案是检查您是否可以更改 NAT 的配置,以允许在 LAN 上使用转换后的地址(有时这是 P2P 系统的要求)。如果此类功能不可用,则您需要新的 NAT。

If you are typing:

telnet 151.53.150.45 20600

from the LAN rather than from the WAN, then your NAT most probably does not handle hairpin situations properly. This means it only expects you to use the translated address from the WAN.

The solution is check whether you can change the configuration of your NAT to enable usage of translated address on the LAN too (it is sometimes a requirement for P2P systems). If such functionalities are not available, then you need a new NAT.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文