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

Socket.Send.Receive - Сообщение делится на фрагменты произвольной длины

23.01.2015, 01:46. Показов 3097. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
клиент шлет массив байт(с <eof>), на сервере дописывается имя клиента в начало массива и возвращается клиенту. Почему сообщение не возвращается целым, а делится на фрагменты?
Обе ProcessConnection работают в отдельных потоках.



серв
Кликните здесь для просмотра всего текста
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
rivate void ProcessConnection(object state)
        {
            ConnectionInfo connection = (ConnectionInfo)state;
            byte[] buffer = new byte[4096];
            try
            {
                while (true)
                {                   
                    int bytesRead = 0;
                    string count = "";
                   
                        bytesRead = connection.Socket.Receive(buffer/*,connection.Socket.Available,0*/);                       
                          
                        IPHostEntry hostInfo = Dns.GetHostByAddress((connection.Socket.RemoteEndPoint as IPEndPoint).Address);
 
                        string ans = "" + hostInfo.HostName.ToString() + " : "; 
                    ans += Encoding.Unicode.GetString(buffer, 0, bytesRead);
                  
                    buffer = Encoding.Unicode.GetBytes(ans);
                    if (bytesRead > 0)
                    {
                        lock (_connections)
                        {
                            foreach (ConnectionInfo conn in
                                _connections)
                            {
                                if (/*conn != connection*/true)
                                {
                                    conn.Socket.Send(buffer/*, buffer.Count(), 0*/);
                                }
                            }
                        }
                    }
 
                    else if (bytesRead == 0) return;
                 
                }
            }
            catch (SocketException exc)
            {
                Console.WriteLine("Socket exception: " +
                    exc.SocketErrorCode);
            }
            catch (Exception exc)
            {
                Console.WriteLine("Exception: " + exc);
            }
            finally
            {
              
            }
        }

клиент
Кликните здесь для просмотра всего текста
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
private void ProcessConnection(object state)
        {
            Socket connection = (Socket)state;
            byte[] buffer = new byte[4096];
            try
            {
                while (true)
                {
                    int bytesRead = connection.Receive(buffer);
 
                    if (bytesRead > 0)
                    {
                        String ans = Encoding.Unicode.GetString(buffer, 0, bytesRead);
 
                        this.wnd.listboxChat.Dispatcher.BeginInvoke(new ThreadStart(delegate
                        {
                            this.wnd.listboxChat.Items.Add(ans);
 
                        }));
                    }
                    else if (bytesRead == 0) return;
                }
            }
            catch (Exception e)
            {
                String ans = e.ToString();
            }
        }
public void sendMessage(String mes)
        {
            byte[] msg = Encoding.Unicode.GetBytes(mes + "<eof>");
 
            
                int bytesSent = clientSoc.Send(msg, msg.Count(), 0);
           
        }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2015, 01:46
Ответы с готовыми решениями:

Чат. При активации функции Send на клиенте, сообщение должно попасть в функцию Receive сервера
привет всем. у меня есть проект чат,который срочно нужно сделать. передача сообщений идет посредством NetworkStrem и BinaryFormatter....

NetBIOS ф-ии Send и Receive
При операциях с NetBios есть две функции SEND (которая отправляет) и RECEIVE (которая принимает) по заранее уже установленному соединению,...

Receive/send text/buf в чем разница?
Вообщем интересует именно разница в: WideString uMsg = Socket-&gt;ReceiveText(); и char *uMsg = new char; ...

4
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
23.01.2015, 11:14
Лучший ответ Сообщение было отмечено morro как решение

Решение

это потому, что TCP/IP хоть и является протоколом с гарантированной доставкой, но никто не гарантирует, что все отправленное придет сразу целиком. Но придет точно. Посему - маркеры начала/конца как минимум должны быть
1
4 / 4 / 2
Регистрация: 06.04.2014
Сообщений: 26
23.01.2015, 18:40
Если строка больше 4кб или сообщения посылаются слишком быстро, они соответсвенно разрываются либо склеиваются. Тебе нужно придумать какой у тебя будет разделитель в строке, и потом парсить строку по этому разделителю.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.01.2015, 13:09
Вот как можно писать такие приложения, не имея даже базовых представлений о работе сети. Вы хотя бы что такое модель ISO\OSI знаете?
0
-15 / 10 / 6
Регистрация: 03.10.2012
Сообщений: 532
24.01.2015, 13:26
Вот держи мой сервер работы с клиентом платформой... Тут главное увидить как сервер работает а клиент и сам напишешь надеюсь...
Я тут какраз пока писал - всё маниакально комментировал - поэтому там даже каждая запетая закомментирована. Полистай, посмотрим. Мб поймешь чо и как.
Едиственно! Когда клиешь пилишь - и если он WinForm то открывай поток чтения в отдельном потоке - а к форме через делегаты обращайся. И будет тебе счастье!
Вложения
Тип файла: zip Server v0.3a.zip (504.5 Кб, 20 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2015, 13:26
Помогаю со студенческими работами здесь

Assembler linux. Socket recv and socket send invalid arguments
Пишу шеллкод. Он ожидает подключения с 2222 порта, сам подключается на 1111 порт, выделяет память, и должен выполняться пересылка сообщений...

Вызов socket.Poll с SelectMode.SelectRead после Receive
Почему после полного считывания данных с сокета методом rcv, метод select продолжает говорить о том, что данные для чтения доступны. Можно...

Метод Socket.Receive(Byte[], Int32, Int32, SocketFlags) отрабатывает некорректно
Пишу передачу файлов с помощью TCP сокетов. Когда казалось уже всё готово..при тестирование в настоящей локальной сети возникли проблемы. ...

Send struct from socket
Здравствуйте, помогите пожалуйста отправить структуру на ++... typedef struct { unsigned int size; unsigned int cmd; ...

Socket Send и Recieve
private void update_table() { Stopwatch sw = new Stopwatch(); sw.Start(); string status...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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