Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Научите


Heh ©   (2002-04-17 09:46:00) 

Мастера, научите плз, как с помощью TServerSocket и TClientSocket передавать данные с использованием SendStream и принимать их(не файл). Данные оправляются разной длины. И что делает TWinSocketStream? А то у меня программа вылетает после 2-й отправки. Что-то не так делаю. Если не сложно, маленький примерчик.
wbr


Donal_Graeme   (2002-04-17 17:01:00) [1]

a MyStream создан к моменту отправки?
тип int точно 2 байта занимает?
размер AnsiString равен длине строки +4 (или 8) байта.
под Pak при приёме достаточно места выделяешь?
и, кстати, указатель на данные в MemoryStream лежит в свойстве Memory, т.е.:
pak=(Packet*)MyStream->Memory; (не уверен в правильности синтаксиса - форум всё-таки по дельфям)


Heh   (2002-04-17 12:26:00) [2]

__________________________________________________
struct Packet{ //структура пакета
int ToUserID;
int ToHandlerID;
int FromToUserID;
int FromHandlerID;
int UserIDIfError;
int CodeError;
int LengthData;
AnsiString Data;
};
TMemoryStream *MyStream;
Packet *pak;
...........
..........
__________________________________________________________
Клиент
нажатие кнопки Send

if (!CS->Active)
{
CS->Address=Edit1->Text;
CS->Port=StrToInt(Edit2->Text);
CS->Active=true;
Edit1->Enabled=false; //адрес
Edit2->Enabled=false; //порт
}

pak->ToUserID=0;
pak->ToHandlerID=1;
pak->FromToUserID=5;
pak->FromHandlerID=2;
pak->UserIDIfError=0;
pak->CodeError=0;
int Len=Edit3->GetTextLen();
pak->LengthData=Len;
pak->Data=Edit1->Text;

MyStream->Position=0;
MyStream->Write(pak,14+Len);
CS->Socket->SendStream(MyStream);
________________________________________
сервер
struct Packet{ //структура пакета
int ToUserID;
int ToHandlerID;
int FromToUserID;
int FromHandlerID;
int UserIDIfError;
int CodeError;
int LengthData;
AnsiString Data;
};
TMemoryStream *MyStream;
Packet *pak;
...........
..........
обработка события чтения данных

int Len=Socket->ReceiveLength();
MyStream->SetSize(Len);
MyStream->Position=0;
Socket->ReceiveBuf(MyStream,Len);
pak=(Packet*)MyStream;
ListBox1->Items->Add(IntToStr(pak->ToUserID));
ListBox1->Items->Add(IntToStr(pak->ToHandlerID));
....
ListBox1->Items->Add(pak->Data);
-------------------------------------------
Подскажите что я делаю не правильно?
Выдает ошибку Project raised exception class EAcessViolation
with message "Access violation at adress ...."


Reindeer Moss Eater   (2002-04-17 12:01:00) [3]

Брось на форму или модуль данных TClientSocket.
Создай поток.
Передай его методу SendStream.
Вроде все.


Наверх

Титульная страница Поиск, карта сайта Написать письмо