Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 07.12.2011
Сообщений: 80

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

19.09.2014, 10:33. Показов 1137. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пробую написать сервер работающий с протоколом UDP который получает от клиента 2 числа считает их сумму и результат отправляет обратно. Вот код:
Сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#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 числа ) считает сумму, но не отправляет. не могу понять почему
Миниатюры
Ошибка Отправки Байта По Протоколу Udp  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2014, 10:33
Ответы с готовыми решениями:

Передать 4 байта по протоколу UDP
Юпатов Дмитрий, Как упростить Ваш пример UDPchat? Задача: сервер выдаёт в цикле таймера для всеобщего пользования постоянно изменяющийся...

Ошибка при распаковке пакета данных по протоколу UDP
Здравствуйте, у меня имеется приложение для отправки изображения рабочего стола на другой компьютер. чтобы было понятнее скажу, что...

Отправка текста по протоколу udp
Добрый день All Захотел поглубже изучить builder c++,и столкнулся с тем что не понимаю как осуществить передачу и прием текстовых...

8
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
19.09.2014, 11:24
Цитата Сообщение от Valimor Посмотреть сообщение
C++
1
cout<<"Ошибка вызова sendto "<<endl;
Valimor, а что возвращает WSAGetLastError() в случае ошибки?
0
2 / 2 / 0
Регистрация: 07.12.2011
Сообщений: 80
19.09.2014, 11:27  [ТС]
Возвращает 10047
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
19.09.2014, 12:05
Valimor, покажите код клиента. Из кода ошибки следует, что client.sin_family не соответсвует Address Family сокета.
0
2 / 2 / 0
Регистрация: 07.12.2011
Сообщений: 80
20.09.2014, 20:14  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
Valimor, покажите код клиента. Из кода ошибки следует, что client.sin_family не соответсвует Address Family сокета.
извините за перерыв, не было интернета. Вот код клиента:
CLIENT

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <winsock2.h>
#include <wininet.h>
#include <winnetwk.h>
#include <iostream>
#include <sys/types.h>
#include <stdio.h>
#include <sys/time.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 peer;
    struct sockaddr_in local;
    //int s;
    int rc;
    int x,y;
    char str1[1],str2[1],sum[1];
    SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    if(s<0)
        cout<<"Сокет не подключен"<<endl;
    else
        cout<<"Сокет создан успешно"<<endl;
    local.sin_family=AF_INET;
    local.sin_port=0;
    local.sin_addr.s_addr=INADDR_ANY;
    cout<<"Отправь 2 числа чтобы получить их сумму"<<endl<<"число 1: ";
    cin>>str1[0];
    //cout<<"\nДлина символа ->"<<strlen(str1[0])<<endl;
    cout<<"\nчисло 2: ";
    cin>>str2[0];
    //cout<<"\nДлина символа ->"<<strlen(str2[0])<<endl;
    //sprintf(str1,"%i",x);
    //sprintf(str2,"%i",y);
    rc=bind(s,(struct sockaddr*)&local,sizeof(local));
    if(rc<0)
    {
        cout<<"Ошибка вызова bind"<<endl;
    }
    else
        cout<<"Инициализация bind прошла успешно"<<endl;
    peer.sin_family=AF_INET;
    peer.sin_port=htons(8020);
    peer.sin_addr.s_addr=inet_addr("127.0.0.1");
    //peer.sin_port=8020;
    //peer.sin_addr.s_addr=INADDR_ANY;
    int clen=sizeof(peer);
    rc=sendto(s,str1,1,0,(struct sockaddr*)&peer,clen);
    if(rc<=0)
        cout<<"Ошибка вызова send"<<endl;
    else
        cout<<"Передано "<<rc<<" байт"<<endl;
    rc=sendto(s,str2,1,0,(struct sockaddr*)&peer,clen);
    if(rc<=0)
        cout<<"Ошибка вызова send"<<endl;
    else
        cout<<"Передано "<<rc<<" байт"<<endl;
    rc=recvfrom(s,sum,1,0,(struct sockaddr*)&peer,&clen);
    if(rc<=0)
        cout<<"Ошибка вызова recv"<<endl;
    else
        cout<<"Получено "<<rc<<" байт"<<endl;
    cout << "\nNumber ->" <<sum[0]<<sum[1]<<endl;
    closesocket(s);
    WSACleanup();
    system("pause");
    return 0;
}
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
20.09.2014, 20:42
Цитата Сообщение от Valimor Посмотреть сообщение
local.sin_port=0;
Обратите внимание на то какой порт вы биндите на стороне клиента (строка 32)? и на какой порт вы пытаетесь отправить из сервера (строка 68, под отладчиком гляньте чем заполнена структура client)?

Можно сделать так - 8020 порт сервера, 8021 порт клинта.
1
2 / 2 / 0
Регистрация: 07.12.2011
Сообщений: 80
20.09.2014, 21:11  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
Обратите внимание на то какой порт вы биндите на стороне клиента (строка 32)? и на какой порт вы пытаетесь отправить из сервера (строка 68, под отладчиком гляньте чем заполнена структура client)?

Можно сделать так - 8020 порт сервера, 8021 порт клинта.
Сделал как вы сказали. Но ошибка осталась.
Но потом решил посмотреть свойство sin.family у сервера и у клиента.И как видно из скрина у клиента оно равно 2, а у сервера 0. так что добавил строку:
C++
1
client.sin_family=AF_INET;
в код сервера перед самым вызовом функции sendto и ура все отправилось.
Но опять же странно почему сбрасывается свойство sin_family у структуры client?
Миниатюры
Ошибка Отправки Байта По Протоколу Udp   Ошибка Отправки Байта По Протоколу Udp  
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
20.09.2014, 21:27
Цитата Сообщение от Valimor Посмотреть сообщение
Но опять же странно почему сбрасывается свойство sin_family у структуры client?
оно заполняется в предыдущих вызовах recvfrom() в строках 48 и 56 - в client записывается адрес порт и т.д. откуда пришла UDP дейтаграмма.
1
2 / 2 / 0
Регистрация: 07.12.2011
Сообщений: 80
20.09.2014, 21:42  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
оно заполняется в предыдущих вызовах recvfrom() в строках 48 и 56 - в client записывается адрес порт и т.д. откуда пришла UDP дейтаграмма.
разве дейтаграмма не должна прийти также из AF_INET?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.09.2014, 21:42
Помогаю со студенческими работами здесь

Передача сообщений по протоколу UDP
Всем привет, и с наступающим. Собственно есть необходимость передавать данные по udp протоколу, пока не представляю как это...

Передача файла по протоколу UDP
Сервер передает файл клиенту если его размер файла больше 8192 байта то файл разбивается на части. С этим все в порядке но вот со...

Передача файлов по протоколу UDP
Здравствуйте! Я написал программу которая передает файл с введенного IP на твой пк, ну и в общем, при вводе IP 255.255.255.255 все...

Передача больших файлов по протоколу UDP
Как отправлять большие файлы ? Помогите с реализацией пожалуйста. Передача файлов по UDP

клиент-серверное приложение по протоколу udp
нужно организовать клиент-серверное приложение по протоколу udp. делаю так: на каждом компе есть общеизвестный udp сокет,который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru