Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием пакетов по UDP (Visual Studio)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
Поскольку программист я не очень то опытный, прошу помощи и подсказки у знающих людей. Очень надеюсь, что это не будет трудно. Мне для анализа некоторых процессов нужно принимать от прибора по UDP пакеты с 64 байтами данных. В дальнейшем их нужно обрабатывать, но это я уже осилю сам. Мне сейчас очень необходима помощь собственно в организации приема этих пакетов. Они идут с периодичностью 35 мС и пропускать нельзя ни одного. Помогите интегрировать в пустой проект Visual Studio 2008 необходимый код для приема. Ну тоесть правильно открыть сокет - адрес 192.168.1.100 порт 5000. Нужно чтобы данные ложились в массив из 64 элементов unsigned char. Ну и как-то вызывался обработчик после каждого принятого пакета. Я пересмотрел кучу примеров, но так и не нашел ни одного интегрированного в Windows Form App. Очень прошу помочь сделать рыбу для приема, а дальше я сам. Пример пустого проекта, в который нужно встроить прием, прилагаю. Огромное Спасибо!

Нажмите для просмотра прикрепленного файла
Ken@t
Во первых UDP использует простую модель передачи, без неявных "рукопожатий" для обеспечения надежности, упорядочивания или целостности данных. Таким образом, UDP предоставляет ненадежный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа.
Во вторых, проект с передатчиком и приёмником UDP прилагаю.
В третьих , когда ж прекратите с этим пропертарным раром баловаться.
smk
Цитата(Ken@t @ Dec 7 2012, 14:01) *
Во первых UDP использует простую модель передачи, без неявных "рукопожатий" для обеспечения надежности, упорядочивания или целостности данных. Таким образом, UDP предоставляет ненадежный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа.
Во вторых, проект с передатчиком и приёмником UDP прилагаю.
В третьих , когда ж прекратите с этим пропертарным раром баловаться.

VS2008 говорит что приложение создано более новой версией и открывать отказывается. Можно что-то предпринять? Спасибо.
Serg76
Цитата(smk @ Dec 7 2012, 16:50) *
VS2008 говорит что приложение создано более новой версией и открывать отказывается. Можно что-то предпринять? Спасибо.

наверное установить VS2010 или воспользоваться конвертером VS2010 -> VS2008
Ken@t
Цитата(smk @ Dec 7 2012, 17:50) *
VS2008 говорит что приложение создано более новой версией и открывать отказывается. Можно что-то предпринять? Спасибо.

Откуда у вас 2008, уму не растяжимо ?
http://www.microsoft.com/visualstudio/rus/...io-2010-express скачайте и установите бесплатную версию Visual C# 2010 Express .
smk
Цитата(Ken@t @ Dec 7 2012, 16:52) *
Откуда у вас 2008, уму не растяжимо ?
http://www.microsoft.com/visualstudio/rus/...io-2010-express скачайте и установите бесплатную версию Visual C# 2010 Express .

Качаю 2012 Express. C# ? Нет, под ХР таки 2010.
smk
Поставил С++. Не открывает. Может как-то по другому сориентируете как и что в пустой проект дописать?
Serg76
Цитата(smk @ Dec 7 2012, 20:27) *
Поставил С++. Не открывает. Может как-то по другому сориентируете как и что в пустой проект дописать?

у меня все открывает без проблем в 10-ой студии, винда 7-ка.

Цитата(smk @ Dec 7 2012, 20:27) *
Поставил С++. Не открывает. Может как-то по другому сориентируете как и что в пустой проект дописать?

Проект на С#, а не на плюсах

качать отсюда http://www.microsoft.com/visualstudio/rus/...#d-2010-express
smk
Цитата(Serg76 @ Dec 7 2012, 19:49) *
у меня все открывает без проблем в 10-ой студии, винда 7-ка.


Проект на С#, а не на плюсах

качать отсюда http://www.microsoft.com/visualstudio/rus/...#d-2010-express

А под плюсы есть что?


Ладно. Поставлю вопрос так - можно ли что-то почитать уровня чайника чтобы по-быстрому разобраться? Куда и в какое место можно дописывать свой код в проект Windows Form? Ну вобщем помогите мне освоить прием-передачу по UDP кто чем может . Пока попробую разобраться в предложенном проекте. Спасибо.
Serg76
Цитата(smk @ Dec 7 2012, 21:53) *
А под плюсы есть что?

увы sad.gif, но в сети этого добра точно должно быть навалом
Ken@t
Цитата(smk @ Dec 7 2012, 21:27) *
Поставил С++. Не открывает. Может как-то по другому сориентируете как и что в пустой проект дописать?

Интересно, я чёрным по белому написал, что необходимо установить. Под управляемый код забудте о плюсах. Так как программист , вы ни какой, то на C# быстрее и обучитесь и сделаете что-то.

smk
Подскажите по простому, в чем разница между сервером и клиентом UDP, в т.ч. с позиции программирования?
Ken@t
Цитата(smk @ Dec 8 2012, 09:43) *
Подскажите по простому, в чем разница между сервером и клиентом UDP, в т.ч. с позиции программирования?

Всё смешалось в кучу , кони, люди.
Сервер : аппаратно - программный комплекс обеспечивающий обслуживание запросов клиентов, иными словами - сервер не иницирует запросов. Примером может служить службы серверов web, mail, time и т. д.

UDP - протокол пользовательски датаграмм , тоесть отправка сообщений от хоста к хосту IP сети без необходимости предварительного сообщения для установки специальных каналов передачи или путей данных.



smk
Цитата(Ken@t @ Dec 8 2012, 08:03) *
Всё смешалось в кучу , кони, люди.
Сервер : аппаратно - программный комплекс обеспечивающий обслуживание запросов клиентов, иными словами - сервер не иницирует запросов. Примером может служить службы серверов web, mail, time и т. д.

UDP - протокол пользовательски датаграмм , тоесть отправка сообщений от хоста к хосту IP сети без необходимости предварительного сообщения для установки специальных каналов передачи или путей данных.

Ага... Спасибо. Я вот тут набросал кое что. Компилируется без ошибок. Теперь вопрос как прием организ0овать. Я так понимаю, что читать нужно в бесконечном цикле и при успешной вычитке складывать в буфер и обрабатывать. Так?

Собственно то что пока есть:
Код
// Test_Form.cpp: главный файл проекта.

#include "stdafx.h"

#include<stdio.h>
#include<string.h>
#include<winsock2.h>
#include<windows.h>

#define PORT  31337
#define SERVERADDR  "127.0.0.1"
#pragma comment (lib, "ws2_32.lib")

#include "Form1.h"

using namespace Test_Form;



[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    char buff [ 10*1024 ];
    //Подключение библиотеки
    if (WSAStartup ( 0x202, ( WSADATA  *) &buff [ 0 ] ))
       {
           return  -1;
       }
    //Создание сокета
    SOCKET  name_sock=socket ( AF_INET, SOCK_DGRAM, 0 );
    if ( name_sock==INVALID_SOCKET )
        {
          WSACleanup ( );
          return -1;
        }


    // Включение визуальных эффектов Windows XP до создания каких-либо элементов управления
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);

    // Создание главного окна и его запуск
    Application::Run(gcnew Form1());
    return 0;
}


Ken@t
Хм.
Наверно так ,
1. Установите VS2010 C# , возьмите книжку Рихтера, почитайте об CLR и С# в частности
2. Возмите любую книгу по программрованию Windows GUI, почитайте о событийной модели.
3. Пример рабочий передатчика и приёмника UDP пакетов , я вам дал.

Зы: Киев большой, найди рядом программиста он на пальцах вам обьяснит. Программирование , пока , не ваше.
smk
Цитата(Ken@t @ Dec 8 2012, 09:09) *
Хм.
Наверно так ,
1. Установите VS2010 C# , возьмите книжку Рихтера, почитайте об CLR и С# в частности
2. Возмите любую книгу по программрованию Windows GUI, почитайте о событийной модели.
3. Пример рабочий передатчика и приёмника UDP пакетов , я вам дал.

Зы: Киев большой, найди рядом программиста он на пальцах вам обьяснит. Программирование , пока , не ваше.

Все это правильно и здорово, но мне надо данные с прибора получать для анализа. Тонкости программирования это конечно интересно, однако обстоятельства времени на самообразование не оставляют. Пока нужно хоть как-то. Совершенствоваться буду потом. Уж простите...
Ken@t
Цитата(smk @ Dec 8 2012, 11:14) *
Все это правильно и здорово, но мне надо данные с прибора получать для анализа. Тонкости программирования это конечно интересно, однако обстоятельства времени на самообразование не оставляют. Пока нужно хоть как-то. Совершенствоваться буду потом. Уж простите...

Мне плоско-параллельно, но вы не сможите решить эту задачу, ни как.
smk
Цитата(Ken@t @ Dec 8 2012, 10:48) *
Мне плоско-параллельно, но вы не сможите решить эту задачу, ни как.

Собственно потому и прошу помощи.
Ken@t
Монстр на managed C++.

на шарпе давал , что было проще, удобней, нативней.

smk
Цитата(Ken@t @ Dec 8 2012, 17:02) *
Монстр на managed C++.

на шарпе давал , что было проще, удобней, нативней.

Спаисбо. Это то что нужно, только не получается на форму UDP Receiver добавить своих кнопок, графиков и т.п. Это где галку снять? Да и данные хотелось бы видеть в виде массива из 64 байт, пытаюсь понять как это сделать. Но и за это Вам огромное спасибо.
Ken@t
Цитата(smk @ Dec 9 2012, 14:17) *
Спаисбо. Это то что нужно, только не получается на форму UDP Receiver добавить своих кнопок, графиков и т.п. Это где галку снять? Да и данные хотелось бы видеть в виде массива из 64 байт, пытаюсь понять как это сделать. Но и за это Вам огромное спасибо.


ТЗ в студию. И это, поставьте себе VS2010 express C#.
bolden
По поводу клиента и сервера TCP и UDP, можно прочитать у Криса Касперски в статье "Самоучитель игры на WinSock".
На С, без Windows Forms, зато всё просто и доступно, есть примеры.
Для начала можно данные и в консоли посмотреть, а потом привязывайте это к чему угодно, в том числе и к Forms.
smk
Цитата(Ken@t @ Dec 9 2012, 14:14) *
ТЗ в студию. И это, поставьте себе VS2010 express C#.

Ставлю. ТЗ такое. Прибор шлет 64 байта данных. Часть пока не задействованы, но остальные представляют собой разбитые на байты unsigned int и unsigned short. Нужно их "склеивать" и писать в файл, параллельно обрабатывая и выводя в виде графиков и промежуточных результатов. Ну примерно так... Обработку я постараюсь осилить самостоятельно, но для быстроты могут понадобиться консультации по некоторым вопросам, напримет как писать файл с именем, заданным "на лету". Ну вот я скажем хочу сохранить сессию которая чем-то для меня примечательна. Я задаю имя файла и командую "писать". Программа должна писать скажем кусками по 10 Мбайт инкрементируя имя файла. В последствии читать. Далее понадобится возможность коммандовать прибору некоторые комманды, скажем отправляя тот же блок данных из 64 байт. Ну пока примерно так.
Вообще мне Windows Form за тем и нужен чтобы проще было всякие графики и таблички делать.
Ken@t
Цитата(smk @ Dec 10 2012, 10:17) *
Ставлю. ТЗ такое. Прибор шлет 64 байта данных. Часть пока не задействованы, но остальные представляют собой разбитые на байты unsigned int и unsigned short. Нужно их "склеивать" и писать в файл, параллельно обрабатывая и выводя в виде графиков и промежуточных результатов. Ну примерно так... Обработку я постараюсь осилить самостоятельно, но для быстроты могут понадобиться консультации по некоторым вопросам, напримет как писать файл с именем, заданным "на лету". Ну вот я скажем хочу сохранить сессию которая чем-то для меня примечательна. Я задаю имя файла и командую "писать". Программа должна писать скажем кусками по 10 Мбайт инкрементируя имя файла. В последствии читать. Далее понадобится возможность коммандовать прибору некоторые комманды, скажем отправляя тот же блок данных из 64 байт. Ну пока примерно так.
Вообще мне Windows Form за тем и нужен чтобы проще было всякие графики и таблички делать.


Это не ТЗ, даже не сочинение по свободной форме, это херь полная.
Структура пакета ,
uint и ushort размерность в битах , big или little endian, бинарное представление образца данных ?
Какие графики, ординаты, масштабирование ?
промежуточные результаты - результаты чего ?

smk
Не могу побороть ситуацию Как ни ставил - не становится 2010 С#. Наверно прийдется винду переставлять. Дома встало все хорошо, а на работе вот такое сообщение при попытке запуска:
Нажмите для просмотра прикрепленного файла
Ken@t
Структура пакета ,
uint и ushort размерность в битах , big или little endian, бинарное представление образца данных ?
smk
Прошу извинения за задержку. Наконец-то поставил VS2010 express C#. Пришлось перенести работы на позже и выйти из ситуации другими средствами т.к. явно уже не успевал. Теперь время начинает появляться. Можем понемногу продолжать поскольку однозначно нужно и важно.

В отношении ТЗ. У меня есть модуль http://www.wiznet.co.kr/Sub_Modules/en/pro...mp;pid=1023#tab На нем и будем тренироваться пока прибора в руках нет. Модуль можно сконфигурировать для работы по UDP, настроить адреса, маску подсети и т.п., для этого к модулю прилагается специальная утилита. Это я сделаю самостоятельно. Реальный пакет занимает 64 байта данных без учета обертки UDP. Модуль под управлением компьютера или контроллера вполне способен этот пакет смоделировать. Сначала задача такая: модуль передает 64 байта по UDP - компьютер принимает и наоборот.

Спасибо.

p.s. На счет C# пожалуй Вы были правы. Как-то оно действительно яснее хотя пока руками не научусь так и буду в полутумане.
Cosmojam
Простите великодушно за провокацию холивара, но всё же откуда требование WinForms и MSVS? На сокетах приём-отправка UDP в одном потоке займёт 30 строк на Си вместе с инклюдами. Если нужен GUI - есть Qt, в нём для работы с сетью тоже есть классы и отличный механизм сигналов-слотов для асинхронного i/o. Можно ненавидеть C++ и тогда есть Java. Но откуда появляется желание гвоздями приковывать себя к одной платформе и одной технологии одной компании?
В аттаче простейший пример на C++ с Qt на приём и отправку текста по UDP. Установите Qt SDK http://www.developer.nokia.com/info/sw.nok...5f8/Qt_SDK.html, откройте проект в QtCreator и запустите его. Проще не придумать и это всё одинаково работает на всех поддерживаемых платформах и исходники самой библиотеки открыты.
smk
Цитата(Cosmojam @ Jan 5 2013, 15:09) *
Простите великодушно за провокацию холивара, но всё же откуда требование WinForms и MSVS? На сокетах приём-отправка UDP в одном потоке займёт 30 строк на Си вместе с инклюдами. Если нужен GUI - есть Qt, в нём для работы с сетью тоже есть классы и отличный механизм сигналов-слотов для асинхронного i/o. Можно ненавидеть C++ и тогда есть Java. Но откуда появляется желание гвоздями приковывать себя к одной платформе и одной технологии одной компании?
В аттаче простейший пример на C++ с Qt на приём и отправку текста по UDP. Установите Qt SDK http://www.developer.nokia.com/info/sw.nok...5f8/Qt_SDK.html, откройте проект в QtCreator и запустите его. Проще не придумать и это всё одинаково работает на всех поддерживаемых платформах и исходники самой библиотеки открыты.

Я могу ошибаться, но это целевой продукт под телефонные приложения?
Cosmojam
Цитата(smk @ Jan 7 2013, 22:19) *
Я могу ошибаться, но это целевой продукт под телефонные приложения?

Не совсем. Он существует для телефонов на Symbian (усилиями Нокиа) и для других мобильных платформ http://en.wikipedia.org/wiki/Qt_%28framework%29#Platforms. Но точно так же Qt существует для десктопных платформ. Изначально библиотека создавалась чтобы быть именно дескптоным кроссплатфоремнным гуем, потом разрослась.
smk
Цитата(Cosmojam @ Jan 8 2013, 05:48) *
Не совсем. Он существует для телефонов на Symbian (усилиями Нокиа) и для других мобильных платформ http://en.wikipedia.org/wiki/Qt_%28framework%29#Platforms. Но точно так же Qt существует для десктопных платформ. Изначально библиотека создавалась чтобы быть именно дескптоным кроссплатфоремнным гуем, потом разрослась.

Я только-только с Borland C++ пересел на VS2010 т.к. есть возможность бесплатного использования. Сразу пересаживаться еще на что-то - мне кажется так я ничего не сделаю. В любом случае спасибо за пдсказку. Обязательно присмотрюсь.
smk
Цитата(Ken@t @ Dec 7 2012, 13:01) *
Во первых UDP использует простую модель передачи, без неявных "рукопожатий" для обеспечения надежности, упорядочивания или целостности данных. Таким образом, UDP предоставляет ненадежный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа.
Во вторых, проект с передатчиком и приёмником UDP прилагаю.
В третьих , когда ж прекратите с этим пропертарным раром баловаться.


Опробовал предложенный Вами проект. Все отлично работает. Однако возникли два вопроса. 1) В части wfListener я не нашел буфера (массива) в который поступают принятые данные и из которого можно было бы их брать; 2) нужно объединить в один wfListener и wfSender. Будет очень удобно иметь возможность как принмать данные, так и слать команды из одной формы.

Спасибо.
SysRq
CODE
SOCKET Socket;

volatile bool stop = false;

// Рабочий поток, разгребаем принятое...

UINT threadLAN(LPVOID foo)
{
fd_set fds;

struct timeval timeout;

while(!stop)
{
timeout.tv_sec = 0;
timeout.tv_usec = 100;

FD_ZERO(&fds);
FD_SET(pDlg->Socket, &fds);

int rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
if(rc > 0)
{
char rbuf[1024];

SOCKADDR_IN clientaddr;

int len = sizeof(clientaddr);
int sz = recvfrom(pDlg->Socket, rbuf, 1024, 0, (sockaddr *) &clientaddr, &len);
if(sz == /* проверка на размер полученных данных */)
{
/* разгребаем данные в rbuf[] */
}
}
}

return 0;
}

// Инициализация...

bool ok = true;

WSADATA wd;
WSAStartup(1, &wd);

Socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(Socket == -1)
{
MessageBox(L"Error creating UDP socket");

ok = false;
}

SOCKADDR_IN UDPserveraddr;
memset(&UDPserveraddr,0, sizeof(UDPserveraddr));

UDPserveraddr.sin_family = AF_INET;
UDPserveraddr.sin_port = htons(5520 /* Номер порта */);
UDPserveraddr.sin_addr.s_addr = INADDR_ANY; /* Приём с любого адреса, в т.ч. широковещательные */

int len = sizeof(UDPserveraddr);

if(bind(Socket, (SOCKADDR *) &UDPserveraddr, sizeof(SOCKADDR_IN)) < 0)
{
MessageBox(L"Error binding UDP socket");

ok = false;
}

if(ok)
{
AfxBeginThread(threadLAN, NULL);
}
smk
Цитата(SysRq @ Jan 14 2013, 06:58) *

Спасибо. Посоветуйте что почитать про устройство программы Windows Form C# VS2010? Вот в какое место пустого проекта вставить предложенный Ваи код? Простите чайника...
SysRq
Цитата(SysRq @ Jan 14 2013, 06:58) *
Вот в какое место пустого проекта вставить предложенный Ваи код?
Оно не C#, оно C\C++ с лёгким налетом MFC (к сути отношения не имеет, но в коде упомянут).
smk
Мне бы в самой структуре проекта разобраться. Вот как разместить код чтобы можно было пользоваться функциями и глобальными переменными во всех файлах проекта? Уровень практически чайниковский...
Manfred
Мне было проще разобраться на примерах из http://www.winpcap.org/ и принемать с помощью их библиотек. Все они для Visual C++. Надо установить WinPCap и в его папках будут примеры.

+ пакеты удобно смотреть с помощью программы http://www.wireshark.org/

Принемаю UDP пакеты на скоростях около 600 Mbps, MTU 8kbyte, в обратную сторону идут команды управления. Пакеты компьютер иной раз теряет, но обычно несколько сот мегабайт за пару сек принемаю без потерь)) Matlab с такой задачей не справлялся
smk
Обязательно посмотрю, спасибо! В целом на передложенном в начале примере разобрался, пока все работает. Сейчас больше вопросов общего характера по VS2010 C#.
smk
Цитата(Ken@t @ Dec 8 2012, 10:09) *
Хм.
Наверно так ,
1. Установите VS2010 C# , возьмите книжку Рихтера, почитайте об CLR и С# в частности
2. Возмите любую книгу по программрованию Windows GUI, почитайте о событийной модели.
3. Пример рабочий передатчика и приёмника UDP пакетов , я вам дал.

Зы: Киев большой, найди рядом программиста он на пальцах вам обьяснит. Программирование , пока , не ваше.

Ух как быстро летит время. Да, Ваше решение хорошо работает и сейчас очень кстати. Программирование конечно у меня хромает, потому прошу помощи. Пытаюсь в Вашем Listener разбирать посылку в 64 байта. Работает. Но через время (около минуты) самопроизвольно закрывается. Успевает принять не более 2000 пакетов по 64 байта. Что не так? Исходник со своими "включениями" прилагаю. Спасибо.
Нажмите для просмотра прикрепленного файла
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.