Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: UDP ...  (Прочитано 11568 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Zeipt
Гость
« : 10-07-2007 22:22 » 

Господа! Объясните пожалста!
написал клиента и сервер.
на одной машине - дружат...
но это было IPPROTO-IP.
изменил на DGRAM и IPproto-UDP - на виртуальной винде 2000 и реальном xp-pro - отказываются...
уже и в настройки сети на обоих лазал...
а задумка простая - один клиент и много серверов, но чтоб по UDP...
может есть исходники - разобраться... или ссылочки?
заранее благодарю!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-07-2007 05:40 » 

Zeipt, покажи код создания сокета.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Zeipt
Гость
« Ответ #2 : 12-07-2007 07:54 » 

    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
   ::m_socket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
sockaddr_in clientService;

    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "10.0.0.10" );
    clientService.sin_port = htons( 55555 );
if ( connect( ::m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
   {
              return 13;
        WSACleanup();
          };

а дальше сенд и ресв... это клиент...
Записан
Zeipt
Гость
« Ответ #3 : 12-07-2007 07:58 » 

у сервепа так же, но inet_addr другой.
а в этом клиенте пробовал даже 255.255.255.255 ставить...
если они в клиенте и в сервере одинаковые - в 1 машине обмениваются нормально...
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 12-07-2007 09:27 » 

Сокету UDP не нужно делать connect, однако ему нужно сделать bind (присвоить адрес). Для отправки сообщений использовать sendto. при создании сокета AF_INET/SOCK_DGRAM не обязательно указывать IPPROTO_UDP - в протоколе IP нет другого датаграммного транспортного протокола.

Вот пример кода клиента, который отправляет сообщение по протоколу UDP в сети IPv6 (это почти тоже самое, что IP, только адрес больше размером)
Код:
#include <winsock2.h>
#include <ws2ip6.h>
#include <stdio.h>

#define ADDR_BUF_LEN 100
#define DST_BUF_LEN 200
int
main(int argc, char ** argv)
{
    char hello[] = "Hello!";
    char * msg = hello;
    char dst_buf[DST_BUF_LEN];
    unsigned char * a;
   
    struct sockaddr_in6 src_addr, dst_addr;
    SOCKET src_sock, dst_sock;
    char addr_buf[ADDR_BUF_LEN];
    size_t addr_len, len;
    struct sockaddr_in6 * from;
   
    int err;
    WSADATA wsaData;
    WORD wVersionRequested;
   
    if (argc < 3)
    {
        printf("<command> ipv6_address port [message]\n");
        exit(1);
    }

    if (argc > 3)
    {
        msg = argv[3];
    }

    wVersionRequested = MAKEWORD(2, 0);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
        printf("Failed to initialize WSA\n");
        exit(-1);
    }

    src_sock = socket(AF_INET6, SOCK_DGRAM, 0);
    if (src_sock == INVALID_SOCKET)
    {
        printf("Failed to bind source socket, error %d\n",
               WSAGetLastError());
        exit(-1);
    }

    memset(&src_addr, 0, sizeof(src_addr));
    memset(&dst_addr, 0, sizeof(dst_addr));

    src_addr.sin6_family = AF_INET6;
    dst_addr.sin6_family = AF_INET6;

    err = inet_pton(AF_INET6, argv[1], &dst_addr.sin6_addr);
    if (err != 1)
    {
        printf("Failed to convert address %s\n", argv[1]);
        exit(1);
    }
    dst_addr.sin6_port = htons(atoi(argv[2]));
    printf("Destination address: %s\n", argv[1]);
    printf("Destination port: %d\n",atoi(argv[2]));

    // Use system source address
    src_addr.sin6_port = htons(0x400);
    err = bind(src_sock, &src_addr, sizeof(src_addr));
    if (err)
    {
        printf("Failed to bind source socket, error %d\n",
               WSAGetLastError());
        exit(-1);
    }

   
   
    err = sendto(src_sock, msg, strlen(msg)+1, 0,
        &dst_addr, sizeof(dst_addr));

    if(err < 0)
    {
        err = WSAGetLastError();
        printf("sendto failed, error code %d\n", err);
        exit(-1);
    }
    printf("Sent to destination: %s\n", msg);
    return 0;
}
                   
   
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 12-07-2007 16:09 » 

npak, connect() вполне допустим, хотя, согласен, это не логично. В этом случае исходящие IP и порт назначаются системой автоматически, а удаленные IP и порт указываются в connect().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Zeipt
Гость
« Ответ #6 : 13-07-2007 08:33 » 

Почти понятно... Огромное спасибо! попробую варианты с bind и отпишусь о результатах!))
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 13-07-2007 09:40 » 

Рома, я не спорю, что для UDP сокета можно вызывать connect. В отличие от TCP вызов connect на стороне отправителя не создает автоматически у получателя информацию об удаленном конце соединения. Поэтому я этим не пользуюсь - на другой стороне нужно делать recvfrom, чтобы узнать адрес отправителя.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 13-07-2007 15:11 » new

Привет всем Улыбаюсь
Заграница нам поможет Улыбаюсь (С) Ильф и Петров
http://www.internet-technologies.ru/books/book_103.html
Замечательная книга, и не только по TCP/IP, есть там и UDP. Рассмотрено все очень подробно и на примерах.
Настоятельно рекомендую скачать. Сам ее пользовал Улыбаюсь
Главня ее прелесть (если я ничего не напутал) - рассмотрены типичные ошибки программирования и заблуждения по поводу протоколов.
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines