Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача числового массива через пакет UDP 
:(
    Опции темы
AvAtArILYA
Дата 9.2.2015, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 9.2.2015

Репутация: нет
Всего: нет



Доброго времени суток. Нужно переделать программу, чтобы передавался только целочисленный массив, текст не предавался. Менял в клиенте буфер, ставил значения не char, а int, тогда начинают ругаться функции sendto и recvfrom, что не удаётся переделать int в const char*... Тогда указывал в сенде и рекфром в скобках не &buff[0], a (char *)&buff[0] ну и дальше, где выводило ошибку, так делал... Тогда работает без ошибок, но всё-равно текст передаётся. 

Сервер:
Код

#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#define PORT 777 // порт сервера
#define sHELLO "Hello, %s [%s] Student\n"
#pragma comment(lib, "WS2_32.lib")

int main(int argc, char* argv[])
{
char buff[1024];
printf("UDP DEMO echo_Server\n");
// Шаг 1 - подключение библиотеки
if (WSAStartup(0x202,(WSADATA *) &buff[0]))
{
printf("WSAStartup error: %d\n",WSAGetLastError());
return -1;
}
// Шаг 2 - создание сокета
SOCKET my_sock;
my_sock=socket(AF_INET,SOCK_DGRAM,0);
if (my_sock==INVALID_SOCKET)
{
printf("Socket() error: %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
// Шаг 3 - связывание сокета с локальным адресом
sockaddr_in local_addr;
local_addr.sin_family=AF_INET;
local_addr.sin_addr.s_addr=INADDR_ANY;
local_addr.sin_port=htons(PORT);
if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr)))
{
printf("bind error: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
// Шаг 4 - обработка пакетов, присланных клиентами
while(1)
{
sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);
int bsize=recvfrom(my_sock,&buff[0],sizeof(buff)-1,0, (sockaddr *) &client_addr, &client_addr_size);
if (bsize==SOCKET_ERROR)
printf("recvfrom() error: %d\n",WSAGetLastError());
// определяем IP-адрес клиента и прочие атрибуты
HOSTENT *hst;
hst=gethostbyaddr((char *) &client_addr.sin_addr,4,AF_INET);
printf("+%s [%s:%d] new DATAGRAM!\n", (hst)?hst->h_name:"Unknown host", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

// добавление завершающего нуля
buff[bsize]=0;
// вывод на экран
printf("C=>S:%s\n",&buff[0]);
// посылка дейтаграммы клиенту
sendto(my_sock,&buff[0],bsize,0, (sockaddr *)&client_addr, sizeof(client_addr));
}
    return 0;
}



Клиент:
Код

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "WS2_32.lib")
#define PORT 777
#define SERVERADDR "127.0.0.1"

int main(int argc, char* argv[])
{
char buff[10zz*1014];
printf("UDP DEMO Client\nType quit to quit\n");

// Шаг 1 - инициализация библиотеки Winsock

if (WSAStartup(0x202,(WSADATA *)&buff[0]))
{
printf("WSAStartup error: %d\n",WSAGetLastError());
return -1;
}
// Шаг 2 - открытие сокета

SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
if (my_sock==INVALID_SOCKET)
{
printf("socket() error: %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
// Шаг 3 - обмен сообщений с сервером

HOSTENT *hst;
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
// определение IP_адреса узла
if (inet_addr(SERVERADDR))
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
else
if (hst=gethostbyname(SERVERADDR))
dest_addr.sin_addr.s_addr=((unsigned long **) hst->h_addr_list)[0][0];
else
{
printf("Unknown host: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
while(1)
{
// чтение сообщения с клавиатуры

printf("S<=C:");fgets(&buff[0],sizeof(buff)-1,stdin);
if (!strcmp(&buff[0],"quit\n")) break;

// передача сообщений на сервер

sendto(my_sock,&buff[0],strlen(&buff[0]),0,(sockaddr *) &dest_addr,sizeof(dest_addr));

// прием сообщения с сервера

sockaddr_in server_addr;
int server_addr_size=sizeof(server_addr);
int n=recvfrom(my_sock,&buff[0],sizeof(buff)-1,0, (sockaddr *) &server_addr, &server_addr_size);
if (n==SOCKET_ERROR)
{
printf("recvfrom() error: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
buff[n]=0;

// Вывод принятого с сервера сообщения на экран

printf("S=>C:%s",&buff[0]);
}

// Шаг последний – выход

closesocket(my_sock);
WSACleanup();
return 0;
}



PM MAIL   Вверх
Loki
Дата 10.2.2015, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



вы передаете только первый символ массива buff[0].
Да и это под виндовс, а не под линукс.
PM MAIL   Вверх
Vasya
Дата 10.2.2015, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Функции send и recvfrom работают с const char* и char* соответственно. Т.е. чтобы передать массив int, надо преоброзовать его в char*. например через reinterpet_cast<const char*>. Если, конечно, яч правильно понял суть проблемы

Код

int data_size = 10;
int *data = new int[data_size];
sendto(sock, reinterpret_cast<const char*>(data), data_size * (sizeof(int)),  &client, sizeof(client));
...
int *data = new[data_size];
int received_size = recvfrom(sock, reinterpret_cast<char*>(data), data_size *sizeof(int), (sockaddr *) &client_addr, &client_addr_size);


Как-то так.

Это сообщение отредактировал(а) Vasya - 10.2.2015, 09:18
PM MAIL   Вверх
svlary
Дата 10.2.2015, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(AvAtArILYA @  9.2.2015,  20:05 Найти цитируемый пост)
чтобы передавался только целочисленный массив


По сети всегда ПЕРЕДАЮТСЯ только БАЙТы. Что означают эти байты - знает только отправитель.
А получатель должен эти байты понимать так, как это подразумевает отправитель.

Т.е. 4 подряд идущих байта могут означать:
- целое число
- плавающее число
- четыре символа ASCII
- от 2 до 4 символов UTF-8

Что конкретно - знает только отправитель и предполагает получатель.
Если я Вас правильно понял, то Вы желаете предавать содержимое массива целых чисел.
Это должно выглядеть как-то так:
Код


int array[5];
array[0] = 0;
. . .
array[4] = 12345;

sendto(my_sock,(char *)&array[0], sizeof(array), 0, (sockaddr *) &dest_addr, sizeof(dest_addr));


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.