0 / 0 / 0
Регистрация: 15.01.2013
Сообщений: 99
1

TCP прием от клиента: Сервер считывает 21 байт не за раз, а за 7 циклов

11.07.2014, 00:19. Показов 1602. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Превью. Лог от сервера
TCP прием от клиента: Сервер считывает 21 байт не за раз, а за 7 циклов


И так.
От клиента поступают запросы.
в среднем от 20 до 30 байт.

Первый запрос приходит успешно. Все 24 байта!
__________________________________________
Отправка запроса № 2
21 байт.
Сервер считывает эти 21 байт, не за раз.
А за 7 циклов, по 3 байт! В чем проблема?
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
       public Client(TcpClient Client)
        {
            int ID = Server.TCount;
            Console.WriteLine("Client[" + ID + "] - Connected!");
            // Объявим строку, в которой будет хранится запрос клиента
            string Request = "";
            // Буфер для хранения принятых от клиента данных
            byte[] Buffer = new byte[1024];
            // Переменная для хранения количества байт, принятых от клиента
            int Count;
            // Читаем из потока клиента до тех пор, пока от него поступают данные
            try
            {
                while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
                {
                    // Преобразуем эти данные в строку и добавим ее к переменной Request
                    Request = Encoding.ASCII.GetString(Buffer, 0, Count);
                    Console.WriteLine(Count);
                    if(Request.Contains("new"))
                    {
                        try
                        {
                            int unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
                            match = r1.Match(Request);
                            if(!match.Success)
                            {
                                Thread.Sleep(1000);
                                Buffer = Encoding.ASCII.GetBytes("302");
                                Client.GetStream().Write(Buffer, 0, Buffer.Length);
                                Console.WriteLine("302");
                            }
                            else
                            {
                                ExecuteQuery("INSERT INTO [task] (id_vk,type,tID,uID,time) VALUES (" + match.Groups[2].Value + ",\"" + match.Groups[1].Value + "\"," + match.Groups[3].Value + "," + match.Groups[4].Value + ", "+unixTime+")");
                                Buffer = Encoding.ASCII.GetBytes("200");
                                Thread.Sleep(1000);
                                Client.GetStream().Write(Buffer, 0, Buffer.Length);
                                Console.WriteLine("200");
                            }
                        }
                        catch
                        {
                            Buffer = Encoding.ASCII.GetBytes("100");
                            Client.GetStream().Write(Buffer, 0, Buffer.Length);
                            Console.WriteLine("100");
                        }
                    }
                    else if(Request.Contains("get"))
                    {
 
                    }
                    else if (Request.Contains("cancel"))
                    {
 
                    }
                    else
                    {
                        Console.WriteLine("301");
                        //SendError(Client, "301");
                    }
                    //LoadData(Request);
                }
            }
            catch
            {
                Server.Threads[ID].Abort();
            }
 
 
 
            
            Client.Close();
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2014, 00:19
Ответы с готовыми решениями:

Протокол TCP. Передать число с клиента на сервер
Привет всем. Нужно передать число с клиента на сервер, чтобы возвращался синус этого числа. Код...

Передать файл по TCP протоколу от клиента на сервер
Товарищи прошу вас помощи, задача - необходимо передать файл по TCP протоколу от клиента на сервер....

Tcp сервер - как отследить отключение клиента?
Уважаемые Гуру! Попробовал запустить тестовый tcp сервер. Tcp-клиенты подключаются так ...

Прием сервером от клиента чисел, затем сервер умножает и отправляет результат клиенту
Здравствуйте! Помогите пожалуйста сделать клиент-серверное приложение. Клиент отправляет серверу...

7
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
11.07.2014, 07:25 2
Цитата Сообщение от kllaid63 Посмотреть сообщение
Отправка запроса № 2
21 байт.
Сервер считывает эти 21 байт, не за раз.
А за 7 циклов, по 3 байт! В чем проблема?
А где здесь проблема ? TCP именно так и работает.
Данные, которые отправила сторона A, могут прийти стороне Б порезанными
на куски заранее неизвестного размера. Или наоборот - объединиться в один
большой кусок. Поэтому делать один Read в надежде, что он вычитает сразу
все данные - ошибочно.
0
0 / 0 / 0
Регистрация: 15.01.2013
Сообщений: 99
11.07.2014, 14:54  [ТС] 3
Спасибо за ответ. Как можно это решить?
0
Эксперт .NET
1883 / 1353 / 323
Регистрация: 15.06.2012
Сообщений: 5,091
Записей в блоге: 3
11.07.2014, 15:05 4
Цитата Сообщение от kllaid63 Посмотреть сообщение
Как можно это решить?
-- фиксирвонная длина сообщения
-- передавать в начале длину сообщения

я, когда валял чат в универе, брал второй вариант (как-то так...), в сети есть более адекватные примеры.
0
Кодогенератор
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
11.07.2014, 18:09 5
Цитата Сообщение от kllaid63 Посмотреть сообщение
Как можно это решить?
Цитата Сообщение от Wolfdp Посмотреть сообщение
-- фиксирвонная длина сообщения
-- передавать в начале длину сообщения
можно передавать стоп-байт, потом читать сообщение, и считать его оконченным после получения этого байта
0
Эксперт .NET
1883 / 1353 / 323
Регистрация: 15.06.2012
Сообщений: 5,091
Записей в блоге: 3
11.07.2014, 18:21 6
Цитата Сообщение от hepper Посмотреть сообщение
можно передавать стоп-байт, потом читать сообщение, и считать его оконченным после получения этого байта
Проблемный вариант, когда часто отсылается куча мелких сообщений. Может прийти кусок сразу с тремя сообщениями, а значит придется куда-то их скидывать.
0
29 / 29 / 10
Регистрация: 06.02.2014
Сообщений: 156
11.07.2014, 18:32 7
Цитата Сообщение от Wolfdp Посмотреть сообщение
Проблемный вариант, когда часто отсылается куча мелких сообщений. Может прийти кусок сразу с тремя сообщениями, а значит придется куда-то их скидывать.
Но именно такой пример демонстрирует MSDN
0
Эксперт .NET
1883 / 1353 / 323
Регистрация: 15.06.2012
Сообщений: 5,091
Записей в блоге: 3
11.07.2014, 18:46 8
Цитата Сообщение от D_Sergeevich Посмотреть сообщение
Но именно такой пример демонстрирует MSDN
ну, во-первых там демонстрируется использование асинхроных методов, а не организация данных, а во-вторых -- это не отменяет внутрению буферизацию при использовании tcp.

скажу так -- если сообщения будут отсылатся по принципу "набрал на клавиатуре, нажал энтер" с нагрузкой в один клиет, то практически этот метод применим, хоть и остается некий риск напоротся на этот баг.
0
11.07.2014, 18:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2014, 18:46
Помогаю со студенческими работами здесь

Как из TCP пакета пришедшего на сервер выделить IP клиента
Как из TCP пакета пришедшего на сервер выделить IP клиента?? Где в передаваемом пакете на сервер...

tcp сервер и клиент, подключающийся несколько раз
собственно есть модель сервера на С++ и клиента также, сервер прослушивает порт на данный момент...

Сцена зависает при запуске TCP-клиента, когда он подключен к TCP - серверу, при этом TCP-клиент полностью функционирует
Проблема описана в заголовке, и хотелось бы услышать ваше мнение, о том как можно решить проблему....

Сервер принимает запрос от клиента только 1 раз (windows)
Всем привет, как заставить сервер принимать от клиента запрос и ждать следующего. В моей...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru