Я написал простое серверное приложение на 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 для локального ip сервера на всех портах от 20000 до 21000 http://img593.imageshack.us/img593/3959/schermata20110405a22492.png
порт 20600, кажется, открыт, согласно canyouseeme.org/ и yougetsignal.com/tools/open-ports/ (на самом деле я могу прочитать в консоли, что пакет был получен), но если я запускаю
telnet 151.53.150.45 20600
, я получаю ошибку «Отказано в соединении».Брандмауэр отключен как на маршрутизаторе, так и на сервере (то же самое работает telnet).
Любая помощь?