Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/43: Рейтинг темы: голосов - 43, средняя оценка - 4.88
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163

Socket.BeginConnect и чтение/запись данных - проверка кода

13.09.2012, 13:42. Показов 9227. Ответов 71
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
private void Connect()
        {
            String server = "192.168.10.100";
            Int32 port = 6000;
            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(server);
            int iPortNo = System.Convert.ToInt16(port);
            IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
            try
            {
                server = "192.168.10.100";
                port = 6000;
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                ip = IPAddress.Parse(server);
                iPortNo = System.Convert.ToInt16(port);
                ipEnd = new IPEndPoint(ip, iPortNo);
                //_socket.Blocking = false; ?????
                _socket.BeginConnect(ipEnd, new AsyncCallback(ConnectCallback), _socket);
            }
            catch (Exception e)
            {
                _socket.Dispose();
                MessageBox.Show(e.ToString() + " Connect()");
            }
        }
public void ConnectCallback(IAsyncResult ar)
        {
            while (flag)
                try
                {
                    FileBuffer = new byte[BYTEBUFFER];
                    int j = 0;
                    Socket client = (Socket)ar.AsyncState;
                    buf12 = new byte[BYTEBUFFER];
                    int read = client.Receive(buf12);
                    fs.Write(buf12,0,buf12.Length);
 
                   int readFile =  fs.Read(FileBuffer, 0, FileBuffer.Length);
                    for (int i = 16; i <= read; i = i + 16)
                    {
                        Convert = BitConverter.ToInt16(buf12, i - 12);
                        
                       /* ThreadPool.QueueUserWorkItem(delegate(object sender)
                        {
                            System.Windows.Forms.DataVisualization.Charting.Chart _chart = (System.Windows.Forms.DataVisualization.Charting.Chart)sender;
                            _chart.Invoke(actionChart, new object[] {_chart, BitConverter.ToInt16(buf12, i - 12)});
                        },chart1);*/
                        if (chart1.InvokeRequired == false)
                            MessageBox.Show("FATAL");
                           Invoke(new Action(() =>
                        {
                            if(readFile !=0)
                                textBoxThread.AppendText(String.Format("{0}:{1}:{2}:{3}", FileBuffer[i - 16].ToString(), FileBuffer[i - 15].ToString(), BitConverter.ToInt16(FileBuffer, i - 14).ToString(), BitConverter.ToInt16(FileBuffer, i - 12).ToString()) + Environment.NewLine);
                            textBox1.Text=String.Format("{0}:{1}:{2}:{3}", buf12[i - 16].ToString(), buf12[i - 15].ToString(), BitConverter.ToInt16(buf12, i - 14).ToString(), Convert.ToString()) + Environment.NewLine;
                          //  chart1.Series[0].Points.AddY(Double.Parse(BitConverter.ToInt16(buf12, i - 12).ToString()));
                          //  textBoxThread.AppendText((j == BitConverter.ToInt16(buf12, i - 12) || j == 1000) ? "" : j.ToString() + Environment.NewLine);
                        }));
                       /* if (i % 400 == 0 || i == 16)
                        {
                            chart1.BeginInvoke(new Action(() =>
                            {
                                chart1.Series[0].Points.AddY(Convert);
                            }));
                        }*/
                    }
                    //    client.BeginReceive(buf12, 0, buf12.Length, 0,
                    //           new AsyncCallback(ReceiveCallback), buf12);
                }
                catch (Exception e)
                {
                    fs.Close();
                    MessageBox.Show(e.ToString() + " ConnectCallback(IAsyncResult ar)"); return;
                }
            
        }
Извеняюсь за быдло код.
Данные поступают я их вывожу в контролы.Также хотелось бы реализовать запись данных в файл и одновременное чтение в другом месте.как мне это реализовать без "Задержки данных" ибо мы используем асинхронный коннект. Также хотелось бы спросить у ГУРУ у меня "правильная логика" полученния данных вывод и всего остального?

Добавлено через 40 минут
И ещё если убрать комментарии возле Chart'a то видно не вооруженным глазом что данные "запаздывают" в Textbox'e я вижу только один путь исправления. "оптимизировать" Chart т.е. выводить только текущие значения(пакеты который только что пришли и прошлый пакет вырисовывать, а не все что бы график не выравнивался и не "скручивался"), но даже он не даст "точных" текущих значений на клиете(они не будут совпадать на сервере) как вывесте текущее значения в Chart??или как вылечить болезнь с "запаздыванием" данных если она вообще решается на моё примере(т.к. используем асинхронный коннект)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2012, 13:42
Ответы с готовыми решениями:

как передать начальные данные в Socket.BeginConnect
Добрый день. У System.Net.Socket есть метод который завершает асинхронное подключение к сокету и выдает начальные данные (принятые от...

Реализовать чтение данных ИБП Ippon через serial socket
Здравствуйте пытаюсь сделать такую задачу. У меня есть бесперебойник ippon я поставил себе такую задачу, нужно что бы по средством...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

71
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 14:04
Цитата Сообщение от videoLoL Посмотреть сообщение
Также хотелось бы реализовать запись данных в файл и одновременное чтение в другом месте
Используй несколько потоков, одним запускаешь на чтение другим на то, что тебе надо. Либо просто создаешь новый поток и там ставишь проверку на какую-нибудь переменную, с условием если она не пуста то прочитать.

Добавлено через 5 минут
И кстати, ты всего лишь делаешь асинхронное подключение, а прием\чтение данных синхронно. Если уж делать асинхронный клиент, то делай его полностью а не частично асинхронным.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 14:07  [ТС]
т.е. получается у меня будет поток(main) в потоке(socket.BeginConnect) в потоке1(read) и в потоке2(write)?

Добавлено через 2 минуты
Спасибо за помощь.почему надо делать всё асинхронно?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 14:21
Ты сам понял что сказал?) поток может быть либо основным либо фоновым, поток в потоке не содержится. Потоки позволяют распараллелить задачи на одновременное выполнение.

Во общих чертах, начни с того, чтобы твой код был оптимален а не все вызывалось в callback'е подключения. Создай дополнительные методы с названиями SendData, ReceiveData, для них создай callback'и. Далее создай отдельный метод для записи в файл, на подобии
using (StreamWriter sw = new StreamWriter(new Filestream......) И добавь в callback приема или отправки вызов соответствующего метода для записи данных в файл.

А теперь по поводу одновременного чтения. Когда клиент подключится запусти новый поток. В нем организуй бесконечный цикл. В цикле проверяй какую-нибудь переменную, а лучше очередь организовать и проверять если что-то поступили в очередь то прочитать эти данные. Естественно добавлять данные в очередь будет после их приема. Хотя я не совсем понимаю, что ыт подразумеваешь под чтением в другом месте, чтение чего? место?

Добавлено через 3 минуты
Цитата Сообщение от videoLoL Посмотреть сообщение
Спасибо за помощь.почему надо делать всё асинхронно?
А какой смысл делать асинхронное подключение? если дальше все синхронно принимается? Хочешь выиграть на скорости подключения? хотя это не повлияет, единственное у тебя выделится фоновый поток под твое новое подключение, но он тебе по сути не нужен. Какова цель использования асинхронного клиента?
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 14:24  [ТС]
спасибо что то я бред написал)..чтения тех же данных что и записал в файл ..зачем=( сам не знаю..место при вызова события нажатия кнопки

Добавлено через 2 минуты
Цель была в том что бы получать данные и выводить в контролл.я делал чз Thread -> TcpClien и NetworkStream и сразу выводил в контролы..но данные "то приходили то приходило слишком много" мне подсказали делай всё чз асинхронное коннект чз сокет.. я так и сделал и данные стали выводится без всяких проблем.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 14:33
Цитата Сообщение от videoLoL Посмотреть сообщение
чтения тех же данных что и записал в файл
Если чтение из переменной с этими данными то, просто добавляй их в очередь и читай или прям когда принял просто выводи куда надо. Если прочитать из файла то проблем не будет, также добавляем очередь на чтение.

TcpClient это уже готовые методы для создания клиент серверных приложений. Конечно лучше использовать класс Socket, более гибкий. Асинхронные сокеты используются для программ с большим количество подключений и т.п. Суть в них такая: тебе не надо выделять потоки под все действия сокетов, они создаются сами. Но под твои нужды вполне сойдет обычный синхронный клиент. Просто используй не BeginConnect, а просто Connect. Синхронные сокеты намного легче в изучении. Поищи мои темы, я не один раз задавал вопросы про клиент серверные приложения, там где-то есть хорошие примеры,, которые покажут тебе как должно выглядеть правильно клиент-серверное приложение. Ну и конечно же в msdn есть примеры. Удачи )
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 14:42  [ТС]
Было бы так просто если данных не 8000 в секунду , а сервер на Ansi-c(B&r микроконтроллер real-time ) не получилось у меня чз Thread-> socket_connect =(

Добавлено через 7 минут
Было предложение считывать данные в Очередь или в список или в "УправляемыйСписок" и после уже юзать их стоит это того?выйгрышь будет по времени??
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 14:54
Лучше в очередь, список придется ковырять постоянно, и он будет увеличиваться, а у вас условие что нужно прочесть только что пришедшие данные. Не вижу проблем со временем, данные поступили, вы их тут же отобразили. Конечно если у вас сервер не на другом континенте Земли.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 14:54  [ТС]
C#
1
2
3
4
5
_socket.BeginConnect->ConnectCallback->Socket client = (Socket)ar.AsyncState;->client.BeginReceive(buf12, 0, buf12.Length, 0,
                               new AsyncCallback(ReceiveCallback), buf12);->textBox1.Invoke(new Action(() =>
                     {
                         textBox1.AppendText(String.Format("{0}:{1}:{2}:{3}", state[i - 16].ToString(), state[i - 15].ToString(), state[i - 14].ToString(), BitConverter.ToInt16(state, i - 12).ToString()) + Environment.NewLine);
                     }));
Данные приходят неправильно.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 15:00
А количество переданных и принятых одинаковое?
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 15:02  [ТС]
Делал чз Socket.Connect данные проскакивают.=( т.е. идут у меня микросекунды и 20% данных не выводится

Добавлено через 48 секунд
переданных да, а принятых не всегда так..если чз асинхронный сокет то всё верно..если как то подругому то нет..думаю это связанно из за Invoke
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 15:18
Попробуй написать консольный вариант клиента и в консоли смотри какие данные приходят, а лучше пиши все в файл и проверяй корректность. Тут ещё огромную роль играет сам сервер, на каком языке он написан?
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 15:27  [ТС]
я его писал язык похож на Чисты Си но с какой то примесью (ANSI-C) сервер написан корректно проверянно на клиенте написанный делфи

Добавлено через 4 минуты
В файл писал чз BeginConnect и всё нормально. я "правильно" сделаю если напишу асинхронный коннект а выводить буду всё синхронно в TextBox, TextBox,TextBox, Chart,Chart?как же тогда выводить в Chart если я вывожу его чз Invoke то видно что данные запазывают в TextBox'e?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 15:27
Ну, в таком случае проверяй пока что на консоли, данные не могут теряться, если только ты раньше времени не заканчиваешь прием. Пробуй без форматирования, т.е. принял строку, записал в переменную и отобразил, думаю разберешься)
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 15:29  [ТС]
а как мне поступить с Chart'ом?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 15:29
videoLoL, Сделай обычный connect, и тогда тебе не придется использовать invoke'и, так как у тебя не будут создаваться новые потоки.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 15:33  [ТС]
Но тут Соль в том что данные могут приходить по две недели или даже по три недели..данные всё идут и идут.и есть кнопка дисконнекта..но если не создавать поток то форма же виснет=(.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 15:38
Как на счет использования событий? отдельно опишешь класс клиента, отдельно класс события. После при приему данных будешь сигнализировать о том, что произошло событие. И последнее, на самой форме сделаешь обработчик события, в который и засунешь invoke ? По идеи не должно будет ни запаздывать, ни тормозить.
1
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
13.09.2012, 15:43  [ТС]
если я тебя понял то ты предлагаешь делать создать Thread в него подавать ThreadStart(Client)
А обработчик события подключения писать на форме?если не правильно понял..то пожалуйста по подробнее про события
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
13.09.2012, 15:52
Создаешь класс для обработки события, обычно это класс унаследованный от EventArgs, в котором содержатся переменные, нужные тебе(например айпи адрес отправителя, количество принятый данных и т.п.) и делаешь там просто конструктор на инициализацию этих данных. Далее в коде клиента созда делег для события, и метод для заполнения данными этого события. Далее в форме останется объявить это события для класса клиента и реализовать его.
Пример как создать события:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ClientSendMsgEventArgs : EventArgs
    {
        public string msg;
        public string IP;
        public string port;
        public ClientSendMsgEventArgs(string msg, string IP, string port)
        {
            this.IP = IP;
            this.port = port;
            this.msg = msg;
        }
    }
 
    public delegate void ClientSendMsgEventHandler(object sender, ClientSendMsgEventArgs e);
Пример как определить событие внутри класса:
C#
1
2
3
4
5
6
7
8
9
public event ClientSendMsgEventHandler ClientSendMsgEvent;
 protected virtual void OnClientSendMsg(ClientSendMsgEventArgs e)
        {
            if (ClientSendMsgEvent != null)
                ClientSendMsgEvent(this, e);
        }
....где то внутри метода отправки данных
OnClientSendMsg(new ClientReceiveMsgEventArgs(str, e.RemoteEndPoint.ToString(), msg));
...
Потоки тут не при чем. Ты пишешь обычный асинхронный клиент, либо любой другой.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.09.2012, 15:52
Помогаю со студенческими работами здесь

Чтение/запись hex кода файла
Я сделал процедуру записи в указанный файл, в указанный адрес нужный код hex. Вот: procedure writebyte(filename:string; Address:...

Проверка прав доступа (чтение/запись) в директории
Нужно проверить, доступна ли данная директория (к примеру &quot;D:\\readonly_folder\&quot;) для записи/чтения файлов. Подскажите, как можно...

Open/Save Dialog. Сериализация данных. Запись/чтение данных объектов в/из потока.
Описана файловая переменная FileOfFilms: file of TFilmArr и переменная, содержащая имя файла FileName: string, на форме присутствуют...

Чтение текстового файла. Парсинг его данных. Создание исключений для данных. Запись свойств объектов в файл
Проблема такая. Есть файл data.txt. В нем например какие-то данные. Landon Donovan, 150, A Hulk Hogan , 100, M Duke Nukem, 50,...

Чтение и запись данных
Здравствуйте, я записываю данные в файл (длинный код): vsevolod-s10.hut4.ru\открытия.txt И читаю я их таким образом:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru