Как узнать удаленный IPшник и порт по хэндлу сокета

Тема в разделе "WASM.NETWORKS", создана пользователем dimonn, 21 май 2007.

  1. dimonn

    dimonn New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2006
    Сообщения:
    38
    Адрес:
    Sim-City
    Сабж
     
  2. dimonn

    dimonn New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2006
    Сообщения:
    38
    Адрес:
    Sim-City
    хм..забыл уточнить : для ws2_32
     
  3. dimonn

    dimonn New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2006
    Сообщения:
    38
    Адрес:
    Sim-City
    опа.. народ звиняйте уже нашел - getsockname
    весь на нервах - предстоит веселая ночь....
     
  4. dimonn

    dimonn New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2006
    Сообщения:
    38
    Адрес:
    Sim-City
    мля, getsockname - для локального адреса
    для удаленного - getpeername
    теперь всё работает.

    p.s. ничё, что я тут сам с собой поговорил :)
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    dimonn
    спасибо, теперь узнал намного больше о сокетах :) Вот если б еще кто-нибудь в подробностях об ioctlsocket или select'е порассуждал :) (если неправильно написал названия, прошу не пинать - по памяти писал)
     
  6. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    MSoft
    Ричард Стивенс рассуждал о них в своей книге.
    И о многом дургом тоже.
     
  7. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Похожая проблема. Забинден сокет, sin_port равен 0, адрес INADDR_ANY. Как узнать номер открытого порта?
     
  8. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Код (Text):
    1. #include <stdio.h>
    2. #include <sys/types.h>
    3. #include <sys/socket.h>
    4. #include <netinet/in.h>
    5.  
    6. extern int errno;
    7.  
    8. int
    9. main(int argc, char* argv[])
    10. {
    11.     struct sockaddr_in local_addr;
    12.  
    13.     struct sockaddr_in getsock_addr;
    14.     socklen_t   slen;
    15.  
    16.     int listenfd;
    17.    
    18.  
    19.     if ((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
    20.     printf("[--] error socket %d\n", errno);
    21.         return -1;
    22.     }
    23.    
    24.     local_addr.sin_family = AF_INET;
    25.     local_addr.sin_port = 0;
    26.     local_addr.sin_addr.s_addr = 0;
    27.  
    28.     if (bind(listenfd,(struct sockaddr *) &local_addr, sizeof(local_addr))) {
    29.     printf("[--] error bind %d\n", errno);
    30.         close(listenfd);
    31.     return -1;
    32.     }
    33.  
    34.     if (getsockname(listenfd, (struct sockaddr*)&getsock_addr, &slen)) {
    35.     printf("[--] error getsockname %d\n", errno);
    36.     close(listenfd);
    37.     return (-1);
    38.     }
    39.  
    40.     printf("[==] local port: %u\n", ntohs(getsock_addr.sin_port));
    41.  
    42.     close(listenfd);
    43.    
    44.     return (0);
    45. }
     
  9. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    nester7
    Странно... У меня выдавало 0. Теперь работает.
     
  10. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Кто-нибудь может подсказать, где ошибка при определении адреса удалённой машины:
    Создаю сокет:
    Код (Text):
    1.      invoke socket,AF_INET,SOCK_STREAM,0 ;создаём сокет
    2.       .if eax != INVALID_SOCKET ; если ошибки
    3.         mov hDcSocket,eax
    4.          invoke WSAAsyncSelect,eax,HendWnd,WM_SOCKET,FD_ACCEPT or FD_READ or FD_CLOSE; функция указывает Windows посылать сообщения заданному окну от определенного сокета
    5.         .if eax != INVALID_SOCKET  ;проверка на ошибку
    6.          invoke htons, DcPort; преобразовать номер порта в сетевой порядок байт
    7.          mov sin.sin_port, ax
    8.          mov sin.sin_family, AF_INET
    9.          mov sin.sin_addr, INADDR_ANY
    10.           invoke bind, hDcSocket, addr sin, sizeof sin ; ассоциировать локальный адрес (представленный в структуре sin)  с сокетом
    11.             .if eax != SOCKET_ERROR
    12.              invoke listen,hDcSocket, 5 ; устанавливает сокет в состояние, в котором он слушает порт на предмет входящих соединений
    13.                 .if eax != SOCKET_ERROR
    Обрабатываю сообщение FD_ACCEPT
    Код (Text):
    1.                 invoke accept,hDcSocket,0,0
    2.          mov HendlConnect,eax
    Пытаюсь узнать удалённый Ip
    Код (Text):
    1.   invoke getpeername,HendlConnect,addr sin,sizeof sin
    И получаю SOCKET_ERROR WSAEFAULT
     
  11. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Уже понял ошибку, третий параметр getpeername не размер sizeof sin а указатель на размер sizeof sin
     
  12. H2RD

    H2RD Игорь

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    7
    Адрес:
    Львов
    Плз напишите дальше как достать ИП
    Делаю
    Код (Text):
    1. mov len,sizeof sin
    2. invoke getpeername,hClient,addr sin ,offset len
    3. invoke inet_ntoa, offset sin
    4. mov     eax,[eax+0ah]
    5. mov     eax,[eax]
    6. invoke inet_ntoa,eax
    7. invoke wsprintf, addr buf_out1, addr NameIP,eax
    выводит не тот ип, или вопше вываливается с ошибкой

    нашёл
    Код (Text):
    1. mov len,sizeof sin
    2. invoke getpeername,hClient,addr sin ,offset len
    3. invoke inet_ntoa, offset sin
    4. mov eax,sin.sin_addr.S_un ; вот ета строка
    5. invoke inet_ntoa,eax
     
  13. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Когда получен FD_ACCEPT
    Код (Text):
    1. szFormat1       db "Интернет-соединение с : [ %u.%u.%u.%u ]",0
    2. addrFrom        sockaddr_in <?>
    3.  
    4.  
    5.             mov addrFromLen, sizeof addrFrom
    6.             invoke accept, Socket,  ADDR addrFrom, ADDR addrFromLen;0, 0
    7.             mov    Accept, eax
    8.  
    9.             xor eax, eax
    10.             mov al, addrFrom.sin_addr.S_un.S_un_b.s_b1
    11.             mov byte1, eax
    12.             mov al, addrFrom.sin_addr.S_un.S_un_b.s_b2
    13.             mov byte2, eax
    14.             mov al, addrFrom.sin_addr.S_un.S_un_b.s_b3
    15.             mov byte3, eax
    16.             mov al, addrFrom.sin_addr.S_un.S_un_b.s_b4
    17.             mov byte4, eax
    18.             push byte4
    19.             push byte3
    20.             push byte2
    21.             push byte1
    22.             push offset szFormat1
    23.             push offset buffer
    24.             call wsprintf
    25.             invoke  SetWindowText, hWnd, ADDR buffer
    Когда получен FD_READ

    Код (Text):
    1. invoke accept, [b]wParam[/b] , addr ClientAddress , addr ClientLen
    2. push ClientAddress.sin_addr.S_un.S_addr
    3. call inet_ntoa
    4.  
    5. ;eax is now a pointer to the ip string
    6. ;invoke MessageBox, hDlg, eax, 0, MB_OK