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

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

13.09.2012, 13:42. Показов 9635. Ответов 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
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
24.09.2012, 13:30  [ТС]
Студворк — интернет-сервис помощи студентам
Тут встала проблема с BeginReceive зациклить его вообще возможно?;Q
Даже если зациклю придётся останавливать отрисовку и снова запускать BeginReceive=(.
или как то можно по проще?
Правильно ли организован клиент (иногда форма внезапно закрывается)
Тут код по читабельнее
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
24.09.2012, 13:44
У тебя просто код не правильно написан. Работай с асинхронным ресивом также как и с синхронным. т.е. в цикле делаешь бесконечные выховы ресива, а в CallBack методе должен быть примерно следующий код:
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
private static void ReceiveCallback( IAsyncResult ar ) {
        try {
            // Retrieve the state object and the client socket 
            // from the asynchronous state object.
            StateObject state = (StateObject) ar.AsyncState;
            Socket client = state.workSocket;
 
            // Read data from the remote device.
            int bytesRead = client.EndReceive(ar);
 
            if (bytesRead > 0) {
                // There might be more data, so store the data received so far.
            state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));
 
                // Get the rest of the data.
                client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
                    new AsyncCallback(ReceiveCallback), state);
            } else {
                // All the data has arrived; put it in response.
                if (state.sb.Length > 1) {
                    response = state.sb.ToString();
                }
                // Signal that all bytes have been received.
                receiveDone.Set();
            }
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
    }
Я же кидал ссылки на примеры асинхронного клиента, если не видел вот снова http://msdn.microsoft.com/ru-r... 39x2a.aspx

Добавлено через 2 минуты
При работе с асинхронными сокетами надо запомнить одну очень важную вещь - все асинхронные операции должны заканчиваться методом "END". Иначе операция считается не завершенной и ожидает завершения.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
24.09.2012, 13:53  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private void ConnectCallback(IAsyncResult ar)
        {
            Socket socket = ar.AsyncState as Socket;
            socket.EndConnect(ar);
            
            while (flag)
            //ConnectDone.Set();
            {
                //int readByte = socket.Receive(buf);
                //OnDataReceived(new DataReceivedEventArgs(buf, readByte));
                client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), buf);
                //MessageBox.Show("dsdsd");
            }
        }
 
        private void ReceiveCallBack(IAsyncResult ar)
        {
            byte[] TmpBuf = ar.AsyncState as byte[];
            OnDataReceived(new DataReceivedEventArgs(TmpBuf, TmpBuf.Length));
        }
я зацикливаю BeginReceive. И форма закрывается.
Если раскоментю MessageBox то всё работает=)..или делаю Thread.Sleep...никак не могу понять почему у меня не работает как надо-_-
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
24.09.2012, 14:03
videoLoL, видимо мои сообщения до тебя не доходят, ладно:

вот как должен выглядеть твой код:
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
private void ConnectCallback(IAsyncResult ar)
        {
            Socket socket = ar.AsyncState as Socket;
            socket.EndConnect(ar);
            
            while (flag)
            //ConnectDone.Set();
            {
                //int readByte = socket.Receive(buf);
                //OnDataReceived(new DataReceivedEventArgs(buf, readByte));
                client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), buf);
                //MessageBox.Show("dsdsd");
            }
        }
 
        private void ReceiveCallBack(IAsyncResult ar)
        {
            byte[] TmpBuf = ar.AsyncState as byte[];
            int bytesRead = client.EndReceive(ar);
 
            if (bytesRead > 0) {
                  OnDataReceived(new DataReceivedEventArgs(TmpBuf, TmpBuf.Length));
            }
        }
Но я бы воспользовался бы примером с msdn который я дал. Реализовал бы класс StateObject, который бы содержал бы всю необходимую инфу о полученных данных. В общем нужны поправки в код клиента и тогда все будет работать.

Если раскоментю MessageBox то всё работает=)
Ничего не работает. Цикл постоянно вызывает метод BeginReceive, который вызывает в свою очередь метод CallBack, а так как в CallBack'е нету завершения асинхронной операции происходит ошибка. А когда вы добавляете MessageBox, то цикл начинает работать с приостановкой, ввиду этого, код как то и начинает работать.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
25.09.2012, 13:36  [ТС]
К сожалению что я вас понимаю..думаете я не пробовал BeginReceive).Дело в том что когда я получаю данные асинхронно и асинхронно их вывожу.то возникает проблема в отображение графика.график хорошо рисуется,но при перетаскивание формы график из "пилы"превращается в непонятный график..а мне надо что бы получалась пила.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
25.09.2012, 13:46
videoLoL, Я сужу по написанному коду и говорю какие ошибки надо исправить, а то что график меняется при переделывании сокетов, тут уж остается тестить, тестить, тестить...
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
25.09.2012, 13:51  [ТС]
При синхронном получение данных такой проблемы нету=(.но при получение их чз BeginReceive нужно данные выводить чз Invoke или BeginInvoke?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
25.09.2012, 13:55
Цитата Сообщение от videoLoL Посмотреть сообщение
При синхронном получение данных такой проблемы нету=(
почитайте доп. статьи по асинхронным сокетам.

При BeginReceive, делайте как до этого - получили данные - записали в событие - событием вывели, invoke понадобится скорее всего для последнего действия.
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
25.09.2012, 14:12  [ТС]
Тот код который вы мне скинули.он закрывает форму.пробежался отладкой и увидел что в цикл заходит быстрее чем успевает отрабатывать BeginRecive.как тогда сделать бесконечный цикл?

Решил сделать так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void ConnectCallback(IAsyncResult ar)
        {
            Socket socket = ar.AsyncState as Socket;
            socket.EndConnect(ar);
                client.BeginReceive(buf, 0, buf.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallBack), buf);
        }
 
        private void ReceiveCallBack(IAsyncResult ar)
        {
            byte[] bufTemp = ar.AsyncState as byte[];
            int bytesRead = client.EndReceive(ar);
            if (bytesRead > 0)
            {
                OnDataReceived(new DataReceivedEventArgs(bufTemp, bufTemp.Length));
                client.BeginReceive(buf, 0, buf.Length, SocketFlags.None,
new AsyncCallback(ReceiveCallBack), buf);
            }
        }
Похоже на правду.но есть мелкие проблемы

Добавлено через 4 минуты
а как прекратить то передачу данных))..EndConnect?EndRecive?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
25.09.2012, 14:19
Цитата Сообщение от videoLoL Посмотреть сообщение
а как прекратить то передачу данных))..EndConnect?EndRecive?
может быть Disconnect ?)
Цитата Сообщение от videoLoL Посмотреть сообщение
как тогда сделать бесконечный цикл?
использовать события по типу ManualResetEvent
0
7 / 7 / 2
Регистрация: 20.04.2011
Сообщений: 163
27.09.2012, 14:52  [ТС]
Привет.Подскажите пожалуйста как осуществляется передача данных и передача например файла?
Думаю что так:
На сервере стоит условие принятие данных if(i == 1)
передача файла это if(i == 0)
Клиент передаёт данные отправляет сначала i = 1;
Если захотели передать данные передаём i = 0. я прав?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
27.09.2012, 15:01
videoLoL, В принципе да, тебе надо как то дать сигнал серверу(если ты с клиента передаешь файл) что сейчас полетит инфа о файле. Это может быть целая строка, например "Sending file" и т.п. А на сервере стоит проверка, если принятые данные содержат "Sending file", то делать то то, если нет просто отобразить принятое сообщение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.09.2012, 15:01

Чтение/запись 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 И читаю я их таким образом:...


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

Или воспользуйтесь поиском по форуму:
72
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru