Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

послать строку в сокет

347
12 августа 2007 года
Maniak
319 / / 05.11.2005
собственно вот вопрос: сервер сделан с помощью winsocks, а клиент на TClientSocket... так посылаю содержимое файла клиенту:
 
Код:
assignfile(f1,'temp.txt');
                reset(f1);
                repeat
                readln(f1,temp);
                st_out:=st_out+temp;
                until eof(f1);
                close(f1);

send(s_clnt, st_out, length(st_out), 0);

клиент принимает так:
 
Код:
msg:=socket.ReceiveText;
memo1.Lines.Add(msg);


но в мемо отображается какаято фигня, и то символов 10 максимум, это при том что файл весит 1 кб...
347
13 августа 2007 года
Maniak
319 / / 05.11.2005
вот таккая конструкция выдает побольше символов (точно не зная все ли...):
 
Код:
var Buf: array[1..65384] of char;
    Len: integer;
begin
Len:=socket.ReceiveBuf(Buf,65384);
...

тока вот патом не знаю как патом Buf в мемо запихнуть...memo1.lines.add(buf);...выводит нулевой байт строки, тоесть размер всей строки и все...
16K
13 августа 2007 года
Zbyszek
118 / / 08.08.2007
Попробуй так:
Код:
...
var RBuff: array [0..255] of Char;
     strr: string;
...
strr:='';
while recv(FSocket, RBuff, 255, 0)>0 do begin
     strr:=strr+string(rbuff);
     FillChar(RBuff,255,#0);
    end;
memo1.lines.add(strr);
...

Возможно, что-то неправильно(писал без Delphi), но, как мне кажется, должно помочь.
347
13 августа 2007 года
Maniak
319 / / 05.11.2005
ну уже почти все работает...сервер вапщето все правильно посылал, а клиентом надо было принимать только так:
 
Код:
var Buf: array[1..65384] of char;
    Len: integer;
begin
Len:=socket.ReceiveBuf(Buf,65384);
...

Но может ктонибудь знает как патом работать с этим Buf?
16K
14 августа 2007 года
Zbyszek
118 / / 08.08.2007
А
 
Код:
memo1.lines.add(string(Buf));
не работает? Или нужно не запихивать в memo а как-то обрабатывать? Можно сделать так:
 
Код:
...
var str: string;
...
str:=copy(Buf,1,Len);
...
347
14 августа 2007 года
Maniak
319 / / 05.11.2005
втом то и дело что такие способы почемуто не помогают...хотя если написать так:
 
Код:
Len:=socket.ReceiveBuf(Buf,65384);
for i:=1 to len do begin
memo1.Text:=memo1.Text+buf;
end;

то что то отображается, но пачемуто далеко не все, т.к. длина пакета гораздо больше...
16K
14 августа 2007 года
Zbyszek
118 / / 08.08.2007
У меня работает так:
Код:
...
uses
  ..., WinSock;
...
const
  header='GET http://server.com/page.html HTTP/1.0'+#13#10+
'Accept: */*'+#13#10#13#10#0;
var
  WSAData: TWSAData;
  FSocket: integer;
  SockAddrIn: TSockAddrIn;
  Str: array [0..255] of Char;
  RBuff: array [0..255] of Char;
  strr:string;
...
function d_addr(IPaddr : string) : Cardinal;
var
  pa: PChar;
  sa: TInAddr;
  Host: PHostEnt;
begin
  Result:=inet_addr(PChar(IPaddr));
  if inet_addr(PChar(IPaddr))=INADDR_NONE then
  begin
    host:=GetHostByName(PChar(IPaddr));
    if Host = nil then
      exit
    else
    begin
      pa := Host^.h_addr_list^;
      sa.S_un_b.s_b1 := pa[0];
      sa.S_un_b.s_b2 := pa[1];
      sa.S_un_b.s_b3 := pa[2];
      sa.S_un_b.s_b4 := pa[3];
      with TInAddr(sa).S_un_b do
        Result:=inet_addr(PChar(IntToStr(Ord(s_b1)) + '.' + IntToStr(Ord(s_b2)) + '.' +
        IntToStr(Ord(s_b3)) + '.' + IntToStr(Ord(s_b4))));
    end;
  end;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
  if WSAStartup($101, WSAData)<>0 then memo1.Lines.Add('error starting up windows sockets');
  FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  SockAddrIn.sin_family := AF_INET;
  SockAddrIn.sin_port := htons(strtoint(Edit2.Text));
  SockAddrIn.sin_addr.s_addr := d_addr(Edit1.Text);
  if Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn)) <> -1 then
   begin
    lstrcpy(Str, PChar(header));
    send(FSocket, Str, lstrlen(Str), 0);
    FillChar(RBuff,255,#0);
    strr:='';
    while recv(FSocket, RBuff, 255, 0)>0 do begin
     strr:=strr+string(rbuff);
     FillChar(RBuff,255,#0);
    end;end;
  closesocket(FSocket);
  WSACleanup;
  strr:=copy(strr,pos('<',strr),lstrlen(@strr[1])-pos('<',strr));
  memo1.lines.add(strr);
end;
...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог