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

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

19.09.2014, 10:33. Показов 1117. Ответов 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,893
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,893
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,893
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,893
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
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru