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

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

Работа с Сокетами [D6, Win2k]


Sam05 ©   (2005-09-19 13:47:00) 

Отправка сообщения
buf :PChar;
begin
sss:=Edit1.Text;
buf:=PChar(sss);
ClientSocket1.Socket.SendBuf(Buf,SizeOf(buf));

Прием
buf :PChar;
begin
i:=socket.ReceiveLength;
j:=socket.ReceiveBuf(Buf,sizeof(buf));

Теперь вопрос:
Если в Edit1.Text записать строку в которой меньше или 3 символа, то процедура приема принимает в buf значение "4", ежели количестов символов 4 и более, то процедура приема показывает то значение которое передавалось. Кто нить будте любезны помогите что это такое твариться


Sam05   (2005-09-26 10:28:00) [1]

Огромное спасибо все работает


Digitman   (2005-09-19 16:41:00) [2]

procedure TForm1.Button1Click(Sender: TObject);
begin
Результат := ClientSocket1.Socket.SendBuf(PChar(Edit1.Text)^,Length(Edit1.Text)+1);
if Результат < Length(Edit1.Text)+1 then
 читать док-цию по неблок.режиму
end;


Sam05   (2005-09-19 16:21:00) [3]

Ой, я вас наверно уже замучил, вроде как все работатет
Результат := ClientSocket1.Socket.SendBuf(Buf^,РАЗМЕР_ПЕРЕДАВАЕМЫХ_ДАННЫХ!!!); вместо РАЗМЕР_ПЕРЕДАВАЕМЫХ_ДАННЫХ!!! я использую StrLen(buf)
, но если пепредаю меньше 3 символов, то первым бывает мой а еще 2 или 1 мусор? с чем это связано? причем J у меня равно 1 или 2, т.е. реальное количество переданных и принятых символов, а выходи "1ЖЕ" если послал "1" или "12Е" если послал 12


Digitman   (2005-09-19 15:58:00) [4]

procedure TForm1.Button1Click(Sender: TObject);
var
buf :PChar;
begin
Buf:=PChar(Edit1.Text);
Результат :=ClientSocket1.Socket.SendBuf(Buf^, РАЗМЕР_ПЕРЕДАВАЕМЫХ_ДАННЫХ!!!);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,k,l:integer;
buf :PChar;
begin
i:=socket.ReceiveLength;
GetMem(buf, i);
try
j:=socket.ReceiveBuf(Buf^,i));
memo1.Lines.Add('Получили: '+inttostr( j)+' байт :  '+buf+'  ');
finally
FreeMem(buf);
end;
end;


Sam05   (2005-09-19 15:39:00) [5]

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

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
i,j,k,l:integer;
buf :PChar;
begin
i:=socket.ReceiveLength;
GetMem(buf, i);
j:=socket.ReceiveBuf(Buf^,i));
memo1.Lines.Add('Получили: '+inttostr(i)+'   '+buf+'  ');
end;

Вот мой код


Digitman   (2005-09-19 15:34:00) [6]

приводи свой вариант кода С УЧЕТОМ [1]


Sam05   (2005-09-19 15:30:00) [7]

а какая еще может быть ошибка , пример то простой, вот если беру напрямую переменной Buf присваиваю какое нить строчное значение причем длинна не имеет значение (buf:='1312313131313123') или даже (buf:='13') , и возвращаю все как было у меня, а не предложеный вами вариант, то принимаю все что угодно, а вот если вместо  (buf:='1312313131313123'), написать
sss:='1312313131313123';
buf:=PChar(sss); то проходять тоже все символы, а вот если
sss:='13';
buf:=PChar(sss); то опять возвращает "4", ну объясните почему, ведь другого кода нет в этом примере.


Digitman   (2005-09-19 15:02:00) [8]

значит у тебя ошибка в программе


Sam05   (2005-09-19 14:26:00) [9]

Спасибо за ответ, что то получилось, но все же
почему то при получении получаю 4 символа которые отправил, а остальные какие то левый, не мои


Digitman   (2005-09-19 14:02:00) [10]

точнее

Прием
buf :PChar;
begin
i:=socket.ReceiveLength; //определяем макс.размер данных, которые м.б. потенциально доступны при последующем чтении
GetMem(buf, i); //выделяем память под буфер размером i !!!!!!!!!!!байт !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
j:=socket.ReceiveBuf(Buf ^, i); //читаем НЕ более i байт в буфер по адресу, хранящемуся в указ.переменной buf

// в j - АКТУАЛЬНЫЙ размер принятых данных (он ВСЕГДА будет =< i)

<Цитата>


Digitman   (2005-09-19 13:58:00) [11]


> что это такое твариться


"тв Арится" то что и ожидалось как результати незнания Паскаля.

Отправка сообщения
buf :PChar;
begin
sss:=Edit1.Text;
buf:=PChar(sss);
ClientSocket1.Socket.SendBuf(Buf ^,SizeOf(buf));

Прием
buf :PChar;
begin
i:=socket.ReceiveLength;
j:=socket.ReceiveBuf(Buf ^, i);


Наверх

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