Проблема удаленного подключения сокета C - PullRequest
0 голосов
/ 07 апреля 2011

Я написал простое серверное приложение на 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).

Любая помощь?

1 Ответ

0 голосов
/ 13 апреля 2011

Если вы печатаете:

telnet 151.53.150.45 20600

из локальной сети, а не из глобальной сети, тогда ваш NAT, скорее всего, неправильно обрабатывает ситуации с заколками. Это означает, что он ожидает, что вы будете использовать переведенный адрес из глобальной сети.

Решение состоит в том, чтобы проверить, можете ли вы изменить конфигурацию NAT, чтобы разрешить использование переведенного адреса в локальной сети (иногда это требуется для систем P2P). Если такие функции недоступны, вам нужен новый NAT.

...