• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Valimor
  • Дата начала
V

Valimor

пробую написать сервер работающий с протоколом 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 числа ) считает сумму, но не отправляет, выдает ошибку. не могу понять почему
159607.jpg
 
R

rrrFer

Не уверен, но думаю что надо переписать так примерно:
rc=sendto(s,buf,1,0,( struct sockaddr * )&local, sizeof(local))

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

Valimor

Не уверен, но думаю что надо переписать так примерно:
rc=sendto(s,buf,1,0,( struct sockaddr * )&local, sizeof(local))

Почему твой сервер отправляект данные так, как будето он клиент?
c конструкцией
rc=sendto(s,buf,1,0,( struct sockaddr * )&local, sizeof(local))
WSAGetLastError() выдает ошибку 10049
А есть отличие?
 
V

Valimor

выяснилось что в структуре client сбрасывается свойство sin_family, то есть не равняется AF_INET. И если добавить строчку:
C++:
client.sin_family=AF_INET;
перед самым вызовом функции sendto, то все отправляется без проблем.
Однако остается вопрос почему sin_family сбрасывается?
 
R

rrrFer

выяснилось что в структуре client сбрасывается свойство sin_family, то есть не равняется AF_INET.
Однако остается вопрос почему sin_family сбрасывается?
Ну.. я не вижу причин ему сбрасываться. Вы пройдитесь отладчиком и попробуйте найти строчку, в которой это происходит. Хотя, я winsock не использую...(мало ли какие там артефакты...).

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

Valimor

Ну.. я не вижу причин ему сбрасываться. Вы пройдитесь отладчиком и попробуйте найти строчку, в которой это происходит. Хотя, я winsock не использую...(мало ли какие там артефакты...).

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

rrrFer

Я Qt использую. Ты его тоже можешь использовать, но с контроллером...я думаю что если на одной из второн будет контроллер, то многие фичи ты не сможешь использовать. Т.е. мало чем от winsock он будет отличаться...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!