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

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

Проблеммы с Socket [D6, Win2k]


Turalyon ©   (2002-02-11 16:49:00) 

Подскажите пожалуйста что я делаю не так... Разбираюсь с копонентами ClientSocket и ServerSocket. Делаю все пока в одной программе... С посылкой сообщений методоми SendText и ReciveText все работает как часы... но мне надо передавать другую информацию.. (Для простоты пока передаю туже строку) Я пытаюсь сделать через SendBuf и соответственно ReciveBuf, у меня она без конца вылетает... Вот код.

procedure TForm1.Button1Click(Sender: TObject);
var buf : PChar;
begin
// GetMem(Buf,Length(Edit1.Text)+1);
Buf := PChar(Edit1.Text);
ClientSocket1.Socket.SendBuf(Buf, Length(Edit1.Text)+1);
//ClientSocket1.Socket.SendText(Edit1.Text);
// FreeMem(Buf);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Open;
ServerSocket1.Open;
end;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var Buf : PChar;
Len : LongInt;
begin
Len := Socket.ReceiveLength;
GetMem(Buf,Len+1);
Socket.ReceiveBuf(Buf,Len);
Memo1.Lines.Add(StrPas(Buf));
// Memo1.Lines.Add(Socket.ReceiveText);
// FreeMem(Buf);
end;


Я уже как только не пробовал. Чувствую что ответ наповерхности.. а понять не могу.


Digitman (M)   (2002-02-12 17:10:00) [1]

Ты почитай про ReceiveLength повнимательней. В особенности - в ремарки вникни. Да задействуй его в теле рисивера, потому как я упростил код рисивера для наглядности. Да еще посмотри, как работает рисивер в методе TSocketTransport.Receive() (модуль SConnect), дабы на грабли не наступать и велосипед не изобратать. Изучи, как это делает сам Борланд !


Turalyon   (2002-02-12 16:04:00) [2]

>Digitman (M)
Спасибо большое! Все заработало (передает), НО локально, т.е. на одной машине.
Как только я запускаю прогу на другой машине, точнее не запускаю, а передаю ей какую-то информацию вылетает сообщение.
"Windows socket error : ..... on API "recv""

Коннект проходит нормально.


Digitman (M)   (2002-02-12 10:38:00) [3]


procedure TForm1.Button1Click(Sender: TObject);
var
buf : PChar;
len : Integer;
begin
Buf := PChar(Edit1.Text);
len := Length(Buf) + 1;
ClientSocket1.Socket.SendBuf(Len, SizeOf(len));
ClientSocket1.Socket.SendBuf(Buf^, len);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var Buf, p : PChar;
Len : LongInt;
i : Integer;
begin
if Socket.ReceiveBuf(Len, SizeOf(Len)) = SizeOf(Len) then begin
GetMem(Buf,Len);
p := Buf;
try
while Len > 0 do begin
i := Socket.ReceiveBuf(p^, Len);
Dec(Len, i);
Inc(p, i);
end;
Memo1.Lines.Add(Buf);
finally
FreeMem(Buf);
end
end;
end;


Turalyon   (2002-02-12 08:38:00) [4]

>Набережных С.
Спасибо большое, перестало ругаться... только при преме из сокета, в конец какой-то мусор дописывает 3-5 символов..., причем длинна полученная (Socket.ReceiveLength) совпадает отправленной...


Набережных С.   (2002-02-11 18:53:00) [5]

procedure TForm1.Button1Click(Sender: TObject);
var buf : PChar;
begin
Buf := PChar(Edit1.Text);
ClientSocket1.Socket.SendBuf(Buf ^, Length(Buf));
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var Buf : PChar;
Len : LongInt;
begin
Len := Socket.ReceiveLength;
GetMem(Buf,Len);
try
Socket.ReceiveBuf(Buf ^,Len);
Memo1.Lines.Add(Buf);
finally
FreeMem(Buf);
end;
end;


Наверх

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