Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 套接字远程连接问题C_Sockets_Connection_Telnet_Nat - Fatal编程技术网

Sockets 套接字远程连接问题C

Sockets 套接字远程连接问题C,sockets,connection,telnet,nat,Sockets,Connection,Telnet,Nat,我用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(ser

我用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

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

telnet 151.53.150.45 20600
我收到一个连接被拒绝的错误。 防火墙在路由器和运行telnet的同一台服务器计算机上都被禁用

有什么帮助吗?

如果您正在键入:

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


解决方案是检查您是否可以更改NAT的配置,以便在LAN上使用转换后的地址。这有时也是P2P系统的要求。如果这些功能不可用,那么您需要一个新的NAT。

路由器通常有配置设置,告诉它们接受/拒绝ping、telnet等。你能远程登录或浏览路由器,看看配置设置是怎么回事吗?你已经问过了-。正如Emil在那篇文章中提到的,你可能想退房。这似乎不是特定于代码的问题。