|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Valentin Nechayev 2:5020/400 23 Apr 2003 11:13:09 To : Daniel Ginsburg Subject : Re: ICQ и поpты -------------------------------------------------------------------------------- >>> Daniel Ginsburg wrote: >> Совершенно никакой rocket science, повторяется на любой FreeBSD: >> ipfw add xxx fwd realip,realport tcp from any to publicip in >> где realip,realport - где на самом деле слушает сервер. >> У меня так на одном хосте висит ssh на любом порту. DG> Способ с ipfw fwd работает в части заворота соединений независимо DG> от номера порта, но не дает способа узнать на какой именно порт клиент DG> пытался сконнектиться в действительности. getsockname() в качестве порта DG> покажет тот самый порт, куда сервер сказал bind(). И давно оно так себя стало вести? Только что проверил на 4.8-RELEASE, честно показывает тот порт, куда пришло соединение согласно TCP заголовку. root@iv:~#ipfw list 00100 fwd 127.0.0.1,2020 tcp from any to me 2021 in 65535 allow ip from any to any netch@iv:~/prog/tests/sockets/listen>./l & telnet localhost 2020 [1] 6084 Trying 127.0.0.1... 0x7F000001:2020 Connected to localhost. Escape character is '^]'. Connection closed by foreign host. [1]+ Done ./l netch@iv:~/prog/tests/sockets/listen>./l & telnet localhost 2021 [1] 6086 Trying 127.0.0.1... 0x7F000001:2021 Connected to localhost. Escape character is '^]'. Connection closed by foreign host. [1]+ Done ./l Как видите, номер порта рисуется совершенно честно. Повторим с другим хостом: netch@iv:~/prog/tests/sockets/listen>./l & telnet 10.0.0.2 2021 [1] 6095 Trying 10.0.0.2... 0x0A000002:2021 Connected to ivq.nn.kiev.ua. Escape character is '^]'. Connection closed by foreign host. [1]+ Done ./l И хост тоже рисуется честно. Во всех случаях l слушала на INADDR_ANY:2020; 10.0.0.2 - алиас на lo0. DG> А вот почему getsockname() дает такой результат в части sin_addr, мне DG> совершенно непонятно. Мне тоже непонятно, как Вы этого добились. DG> Из предыдущего моего письма: >> Hа FreeBSD 4.8-RELEASE >> # ifconfig xl0 alias 10.0.1.3 255.255.255.255 >> # ipfw add 50 fwd 10.0.0.1,10000 tcp from any to 10.0.1.3 in >> # ./listener -p 10000 >> Connection from 10.0.0.254 1319 to 10.0.0.254 10000 >> >> 10.0.0.254 - адрес другой машины, где сказали telnet 10.0.1.3 12345 >> listener - маленькая пограмуля, которая ничем кроме, как bind(), >> listen(), accept() и напечатать результат getpeername(), >> getsockname(), не занимается. Вот мой код l.c: ==={{{ #include <sys/types.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <err.h> #include <stdio.h> int main() { int s, s2; int c1 = 1; struct sockaddr_in sia; socklen_t sl; memset( &sia, 0, sizeof sia ); sia.sin_family = AF_INET; sia.sin_addr.s_addr = INADDR_ANY; sia.sin_port = htons( 2020 ); s = socket( PF_INET, SOCK_STREAM, 0 ); if( s == -1 ) err( 1, "socket()" ); setsockopt( s, SOL_SOCKET, SO_REUSEADDR, &c1, sizeof c1 ); setsockopt( s, SOL_SOCKET, SO_REUSEPORT, &c1, sizeof c1 ); if( bind( s, (struct sockaddr*) &sia, sizeof sia ) < 0 ) err( 1, "bind()" ); if( listen( s, 10 ) < 0 ) err( 1, "listen()" ); s2 = accept( s, NULL, NULL ); if( s2 == -1 ) err( 1, "accept()" ); sl = sizeof sia; if( getsockname( s2, ( struct sockaddr* ) &sia, &sl ) < 0 ) err( 1, "getsockname()" ); printf( "0x%08lX:%d\n", ntohl(sia.sin_addr.s_addr), (int)ntohs(sia.sin_port) ); return 0; } ===}}} Компилировалось: gcc -o l l.c -g -Wall -W Может, влияет разная обработка проходящего на lo0 и на честные интерфейсы? Проверьте на lo0. Я как доберусь до работы проверю на эзере. -netch- --- ifmail v.2.15dev5 * Origin: Dark side of coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/73688b53aaa3.html, оценка из 5, голосов 10
|