узнать IP

Тема в разделе "WASM.NETWORKS", создана пользователем vorukab, 23 ноя 2006.

  1. vorukab

    vorukab New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    2
    Здравствуйте господа!
    Помогите мне пожалуйста разобраться с одним вопросом.
    Есть сокеты (есть и потоковый, и дадаграммный), которые сидят на портах и слушают их. Иногда им приходят пакеты. Как узнать IP адрес отправителя этих пакетов?
     
  2. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    Может код поможет
    Код (Text):
    1. if(getpeername(hAccept,(sockaddr *) &sin,(int *)&temp)!=SOCKET_ERROR)
    2. {
    3.     if(p=inet_ntoa(sin.sin_addr))
    4.     {
    5.         strcpy(szRemIp,p);
    6.     }
    7. }
     
  3. vorukab

    vorukab New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    2
    спасибо.
    с потоковыми сокетом понятно. а как быть с датаграмным? getpeername как я понял не работает с ними.
     
  4. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    int PASCAL FAR recvfrom (SOCKET s, char FAR * buf, int len, int flags,
    struct sockaddr FAR *from, int FAR * fromlen);
     
  5. _Raven

    _Raven New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2006
    Сообщения:
    34
    Я так понял тебя интересует UDP. Спускаешся на уровень ниже и ловишь IP-пакеты. В любом из них есть адреса отправителя и получателя.
     
  6. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> с потоковыми сокетом понятно. а как быть с датаграмным? getpeername как я понял не работает с ними.

    Код (Text):
    1.         SOCKET sock;
    2.     struct sockaddr_in sin;  
    3.     char buff[BUFFSIZE];
    4.  
    5.          if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
    6.     {
    7.         fprintf(stderr, "socket creation error\n");
    8.         return -1;
    9.     }
    10.  
    11.     bzero(&sin, sizeof(sin));
    12.     sin.sin_family = AF_INET;
    13.     sin.sin_port = htons(atoi(argv[1]));
    14.     sin.sin_addr.s_addr = INADDR_ANY;
    15.  
    16.     if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)))
    17.     {
    18.         fprintf(stderr, "bind() error\n");
    19.         close(sock);
    20.  
    21.         return -1;
    22.     }
    23.  
    24.     while (1)
    25.     {
    26.         struct sockaddr_in client_addr;
    27.         int client_addr_size = sizeof(client_addr);
    28.  
    29.         bzero(&buff, sizeof(buff));
    30.         int len = recvfrom(sock, buff, sizeof(buff), 0, (struct sockaddr *)&client_addr, &client_addr_size);
    31.  
    32.         printf("client %s\n", inet_ntoa(client_addr.sin_addr));
    33.  
    34.         // processing client connection...
    35.     }
    36.  
    37.     closesocket(sock);