Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Вниз

Проблеммы с Socket 


Turalyon   (2002-02-11 16:49) [0]

Подскажите пожалуйста что я делаю не так... Разбираюсь с копонентами 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;


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



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

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;



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

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



Digitman (M)   (2002-02-12 10:38) [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 16:04) [4]

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

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



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

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




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.029 c
6-69938           PL                    2002-02-01 20:51  2002.04.22  
traceroute


1-69897           ymin                  2002-04-09 13:56  2002.04.22  
Есть ли Help в минимальной установке Delphi 6?


14-70017          Sergo                 2002-03-14 12:28  2002.04.22  
Тема про вирус!!!


3-69669           kserg@ukr.net         2002-04-03 12:17  2002.04.22  
ADOQuery- как правильно работать с параметриз.запросом


7-70053           petyun                2002-01-21 14:43  2002.04.22  
внешнее устройство