Ошибка Отправки Байта По Протоколу Udp

Тема в разделе "C и С++ FAQ", создана пользователем Valimor, 19 сен 2014.

  1. Valimor

    Valimor Well-Known Member

    Регистрация:
    10 апр 2010
    Сообщения:
    45
    Симпатии:
    0
    пробую написать сервер работающий с протоколом UDP который получает от клиента 2 числа считает их сумму и результат отправляет обратно. Вот код:
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Сервер</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    #include <winsock2.h>
    #include <wininet.h>
    #include <winnetwk.h>
    #include <iostream>
    #include <sys/types.h>
    #include <stdio.h>
    #include <sys/time.h>
    #include <errno.h>
    #include <ws2tcpip.h>

    using namespace std;

    int main()
    {
    setlocale(LC_ALL,"RUS");

    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested=MAKEWORD(2,2);
    WSAStartup(wVersionRequested,&wsaData);

    struct sockaddr_in local;
    struct sockaddr_in client;
    int rc;
    char buf[1];
    int x,y,sum;

    SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    if(s<0)
    cout<<"Сокета тютю"<<endl;

    local.sin_family=AF_INET;
    local.sin_port=htons(8020);
    local.sin_addr.s_addr=INADDR_ANY;
    client.sin_family=AF_INET;
    client.sin_port=htons(8020);
    int clientlen=sizeof(client);
    //ca=&client;
    //sa=&local;
    rc=bind(s,(struct sockaddr*)&local,sizeof(local));
    if(rc<0)
    {
    cout<<"Ошибка вызова bind"<<endl;
    }
    else
    cout<<"Инициализация bind прошла успешно"<<endl;

    rc=recvfrom(s,buf,1,0,(struct sockaddr*)&client, &clientlen);//получаем первое число
    if(rc<0)
    cout<<"Ошибка вызова recv1"<<endl;
    else
    cout<<"Принят "<<rc<<" байт"<<endl;
    cout<<"Символ ->"<<buf[0]<<endl;
    x=atoi(buf);
    cout<<"Число ->"<<x<<endl;
    rc=recvfrom(s,buf,1,0,( struct sockaddr * )&client, &clientlen);//получаем второе число
    if(recv<0)
    cout<<"Ошибка вызова recv2";
    else
    cout<<"Принят "<<rc<<" байт"<<endl;
    cout<<"Символ ->"<<buf[0]<<endl;
    y=atoi(buf);
    cout<<"Число ->"<<y<<endl;
    sum=x+y;                              //суммируем
    cout<<"Полученная сумма "<<sum<<endl;
    sprintf(buf,"%i",sum);
    cout<<"Полученная сумма в символе "<<buf<<endl;
    rc=sendto(s,buf,1,0,( struct sockaddr * )&client, sizeof(client));//должен отправить здесь, но не отправляет
    if(rc<0)
    cout<<"Ошибка вызова sendto "<<endl;
    //}
    system("pause");
    cout << "Hello world!" << endl;
    closesocket(s);
    WSACleanup();
    return 0;
    }
    Сервер запускается без ошибок принимает данные( 2 числа ) считает сумму, но не отправляет, выдает ошибку. не могу понять почему
    [​IMG]
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Не уверен, но думаю что надо переписать так примерно:
    rc=sendto(s,buf,1,0,( struct sockaddr * )&local, sizeof(local))

    Почему твой сервер отправляект данные так, как будето он клиент?
     
  3. Valimor

    Valimor Well-Known Member

    Регистрация:
    10 апр 2010
    Сообщения:
    45
    Симпатии:
    0
    c конструкцией
    rc=sendto(s,buf,1,0,( struct sockaddr * )&local, sizeof(local))
    WSAGetLastError() выдает ошибку 10049
    А есть отличие?
     
  4. Valimor

    Valimor Well-Known Member

    Регистрация:
    10 апр 2010
    Сообщения:
    45
    Симпатии:
    0
    выяснилось что в структуре client сбрасывается свойство sin_family, то есть не равняется AF_INET. И если добавить строчку:
    Код (C++):
    client.sin_family=AF_INET;
    перед самым вызовом функции sendto, то все отправляется без проблем.
    Однако остается вопрос почему sin_family сбрасывается?
     
  5. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Ну.. я не вижу причин ему сбрасываться. Вы пройдитесь отладчиком и попробуйте найти строчку, в которой это происходит. Хотя, я winsock не использую...(мало ли какие там артефакты...).

    А что вы пишите вообще за программу?
     
  6. Valimor

    Valimor Well-Known Member

    Регистрация:
    10 апр 2010
    Сообщения:
    45
    Симпатии:
    0
    судя по всему это поле сбрасывается при вызовах функций recvfrom.
    Я никогда раньше сетевым программированием не занимался, ну а тут по работе понадобилось, поискал в гугле наткнулся на winsock. Пока учусь на нем писать, вот и выбрал простенькую задачу написать небольшой сетевой калькулятор
    А вообще стоит задача обмена данными между компом и PIC микроконтроллером по интерфейсу Ethernet используя протокол UDP ну и сверху там обертку реализовать, свой небольшой протокол передачи данных.
    А что используешь? а то как понимаешь winsock это первое на что натолкнулся, вот его и использую. если есть инструменты получше, то с удовольствием на них перейду
     
  7. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Я Qt использую. Ты его тоже можешь использовать, но с контроллером...я думаю что если на одной из второн будет контроллер, то многие фичи ты не сможешь использовать. Т.е. мало чем от winsock он будет отличаться...
     
Загрузка...
Похожие Темы - Ошибка Отправки Байта
  1. Valimor
    Ответов:
    1
    Просмотров:
    960
  2. Ruska132
    Ответов:
    1
    Просмотров:
    47
  3. Lamerman
    Ответов:
    0
    Просмотров:
    30
  4. Enima
    Ответов:
    0
    Просмотров:
    58
  5. Baindt
    Ответов:
    1
    Просмотров:
    84

Поделиться этой страницей