Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2016, 21:23   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Сокеты в Windows Forms

Недавно я поднимал топик http://programmersforum.ru/showthread.php?t=288760 и несколько подобных, но ответа так и не получил. Получил, типо оптимизируй TCP, правильно таймауты и паузы расставляй... До сих пор я не понял, что делать, поэтому решил повернуть вопрос по-другому. Я объясню, как у меня сделаны сокеты, а в ответ хотел бы услышать, как изменить этот код, где есть 3 разных программы, запускаемые теоретически с 3 разных компьютеров, чтобы одна программа дожидалась до конца данные от другой программы, а третья программа дожидалась данных от 2 программы, и только после этого происходил новый цикл. Сейчас у меня проблема, что три программы работают в бесконечном цикле обработки данных, но исходные данные во второй программе - это переденный из 1 программы результат обработки данных в первой программе.
Если проще, я моделирую радиопередатчик, канал связи и приемник - 3 черных ящика, обмен данных между которыми обеспечивают Сокеты.
Krasi вне форума Ответить с цитированием
Старый 25.05.2016, 21:30   #2
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Итак, начнем. Что происходит в 1 программе. Нужно просто передать данные во вторую программу, а затем дальше обработать новые данные и снова их передать... Код:

Код:
using System.Net;
using System.Net.Sockets;
......

Socket sSender = null;
        List<double> OFDMfull = new List<double>();
.....

if (!tmr.Enabled)
            {
                sSender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sSender.Connect(new IPEndPoint(IPAddress.Loopback, 8080));
            }

            if (tmr.Enabled)
            {
                sSender.Close();
            }

.......

//Синхронный TCP-клиент для передачи всех NProc символов:
            try
            {

                byte[] sb = OFDMfull.SelectMany(value => BitConverter.GetBytes(value)).ToArray();
                Debug.WriteLine(sb);

                if (sSender.Connected)
                {

                    sSender.Send(sb);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
            //Конец синхронного TCP-клиента для передачи каждого символа
Если ничего не забыл, то получается, что это весь код, чтобы передать данные. Если ошибся, поправьте, пожалуйста.
Получается, если во второй программе данные еще не закончили обрабатываться, а из первой программы поступают уже новые данные, получится коллапс, как это учесть?

Последний раз редактировалось Krasi; 25.05.2016 в 21:39.
Krasi вне форума Ответить с цитированием
Старый 25.05.2016, 21:42   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Как же вы путано объясняете.

TCP это потоковая передача! Не пакетная и не байтовая.
Что это значит? А то что реально данные накапливаются в буферах потом порция отправляется. По дороге данные могут разбиться на пакеты, а могут и склеиться.
Вам никто не гарантирует не время задержки в буфере, не размер реальной порции которая уйдет с вашего компьютера.

Так вот ваша программа должен быть готов, что к ней за раз придёт не 1000 элементов double, а к примеру 1001 байт (250.25 шт Double ).
На приемной стороне вы должны организовать буфер. Буфер по русски задержка. Он задерживает данные прежде чем отдать дальше.
Так вот в буфере вы накапливаете свои данные ждёте пока не придёт более чем 1000 элементов double. И только тогда уже отдаёте из этого буфера 1000 double на обработку и отображение.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 25.05.2016 в 21:48.
Pavia вне форума Ответить с цитированием
Старый 25.05.2016, 22:35   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы отделите прием от обработки, если уж так.

и переместил вашу тему, это не С++.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ и windows forms mad_ded Windows Forms 3 05.02.2015 17:01
Windows Forms С++ Aleks1994 Помощь студентам 2 04.04.2013 18:40
Сокеты windows Slafka C/C++ Сетевое программирование 2 22.06.2011 00:16
Сокеты Windows Slafka Visual C++ 0 06.06.2011 15:00
Windows Forms masashama Windows Forms 12 14.02.2011 16:14