Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [TCP Sockets] Асинхронный прием данных, Сериализованных 
:(
    Опции темы
APXEOLOG
Дата 21.10.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.4.2007
Где: Мурманск

Репутация: нет
Всего: 1



День добрый. Пытаюсь переслать сериализованный класс через TCP, но получаю косяки.
Вот код приема данных на сервере:
Код

        [Serializable]
        class GameData
        {
            public GameData()
            {
            }
            public string str;
        }
        
        ...
        
        byte[] byteData;

        private void OnAccept(IAsyncResult ar)
        {
            try
            {
                Socket clientSocket = serverSocket.EndAccept(ar);
                serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
                byteData = new byte[1000];
                clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, 
                    new AsyncCallback(OnReceive), clientSocket);                
            }
            catch (Exception ex)
            { 
                MessageBox.Show(ex.Message, "SGSserverTCP", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error); 
            }
        }

        private void OnReceive(IAsyncResult ar)
        {
            try
            {
                Socket clientSocket = (Socket)ar.AsyncState;
                clientSocket.EndReceive(ar);

                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream mst = new MemoryStream(byteData);

                mst.Position = 0;
                GameData rGd = (GameData)bf.Deserialize(mst);

                mst.Close();
                byteData = null;
                txtLog.Text += '\n' + rGd.str;

                GameData msgToSend = new GameData();
                msgToSend.str = "test";

                MemoryStream sGd = new MemoryStream();

                bf.Serialize(sGd, msgToSend);

                clientSocket.BeginSend(sGd.GetBuffer(), 0, sGd.GetBuffer().Length, SocketFlags.None,
                        new AsyncCallback(OnSend), clientSocket);
                sGd.Close();
            }
            catch (Exception ex)
            { 
                MessageBox.Show(ex.Message, "SGSserverTCP", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            }
        }


Данные с клиента отправляю путем:
Код

            GameData msgToSend = new GameData();

            msgToSend.str = "starting message";
            BinaryFormatter bf = new BinaryFormatter();
            System.IO.MemoryStream sGd = new System.IO.MemoryStream();
            bf.Serialize(sGd, msgToSend);

            //Send it to the server
            clientSocket.BeginSend(sGd.ToArray(), 0, sGd.ToArray().Length, SocketFlags.None, new AsyncCallback(OnSend), null);
            sGd.Close();


Сервер генерит исключение. В текущим случае - пишет "Недопустимый двоичный формат входного потока. Начало содержимого (в байтах): 00 00 00  00 03 00 00 00 00 00 61 73 64  . . ."

В чем косяк?

ЗЫ И еще вопрос, пока не забыл: будет ли byteData[1000] ограничивать размер класса? т.е. если сериализованный класс будет больше 1кб то он не будет обработан полностью?

Это сообщение отредактировал(а) APXEOLOG - 21.10.2009, 16:18
--------------------
Ученые долго не знали как назвать частоту.Потом так и назвали Hz.
PM MAIL ICQ   Вверх
APXEOLOG
Дата 22.10.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.4.2007
Где: Мурманск

Репутация: нет
Всего: 1



Выяснил что при сериализации получаю и отправляю 157 байт, а получаю 14 байт, причем отличающихся от посланных...
--------------------
Ученые долго не знали как назвать частоту.Потом так и назвали Hz.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0386 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.