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

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

Люди помогите сделать RECV что-то у меня не получается? [D6, Win95/98, WinME, NT4, Win2k, WinXP]


NikNet ©   (2005-05-06 23:40:00) 

Function SendPort(port:word; ip,txt:string):String;
 Var
 D:TWSAData;
 S:TSocket;
 A:TSockAddr;

 Function SendTxt(txt:String):Boolean;
 Var
 Buffer:array of char;
 Begin
 SetLength(Buffer, Length(txt));
 Move(txt[1], Buffer[0], Length(txt));
 send(S, Buffer[0], Length(txt), 0);
 end;

 Begin
  IF WSAStartup($101,D) = 0 Then
  A.sin_family:=AF_INET;
  A.sin_addr.S_addr:=inet_addr(pchar(ip));
  S:=socket(AF_INET,SOCK_STREAM,0);
  if S<>INVALID_SOCKET then
  A.sin_port:=htons(port);
  if connect(S,A,sizeof(A))=0 then
  Begin
  //========================================
    SendTxt(txt);
  //========================================
  end;
  closesocket(s);
  WSACleanup;
  end;


atruhin   (2005-05-09 10:02:00) [1]

>>XProger ©   (08.05.05 17:21) [7]
Ты сам этот код пробовал? Он возможно сработает для незагруженной сети, и очень маленького запроса, ответа, в общем же случае код написан с грубейшими ошибками и работать не будет.


NikNet   (2005-05-09 03:34:00) [2]

Всем СПАСИБО :))))))))))))))))))))


XProger   (2005-05-08 17:21:00) [3]

Так бы сразу сказал, что запросы отправляешь ;)

function GetHTTP(const address: string): string;
var
wData : WSADATA;
addr  : sockaddr_in;
sock  : integer;
error : integer;
buf   : array [0..1023] of Char;
str   : string;
phe   : PHostEnt;
begin
Result := '';
WSAStartup($0101, wData);
phe := gethostbyname(PChar(string(address)));
if phe = nil then
begin
WSACleanup();
Exit;
end;

sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if sock =  INVALID_SOCKET then
begin
WSACleanup();
Exit;
end;

addr.sin_family := AF_INET;
addr.sin_port   := htons(80);
addr.sin_addr   := PInAddr(phe.h_addr_list^)^;

error := connect(sock, addr, sizeof(addr));
if error = SOCKET_ERROR then
begin
closesocket(sock);
WSACleanup();
Exit;
end;

str := 'GET http://' + address + '/index.html HTTP/1.0'#13#10#13#10;
send(sock, str[1], Length(str), 0);

ZeroMemory(@buf, 1024);
error := recv(sock, buf, 1024, 0);

while (error > 0) or (error = -1) do
begin
if error = -1 then break;
Result := Result + Copy(buf, 0, error);
error  := recv(sock, buf, 1024, 0);
end;

closesocket(sock);
WSACleanup();
if Result <> '' then
Result := Copy(Result, pos(#13#10#13#10, Result) + 4, Length(Result));
end;


atruhin   (2005-05-08 13:47:00) [4]

>> А она будет работать с HTTP протоколами?
Нет не будет. HTTP работает по TCP-IP.
>> На TCP при больших пакетах могут быть бяки... :)
И как же по TCP весь интернет работает :). Бяки это от головы.

По вопросу вот пример посылки данных. Посмотри описание всех функций и сделай прием аналогично. Это несложно. А статей на русском море, даже на этом сайте.

function TInternalThread.SendDataToSocket(Sct : TSocket; var Data : TData; var LenData : integer):boolean;
var
  Offs, Len, res : longint;
  FDSet:TFDSet;
  TV : TTimeVal;
begin
  Result := false;
  if LenData <=0 then exit;
  if Sct = INVALID_SOCKET then exit;
  Offs := 0;
  tV.tv_sec := SendTimeoutSec;
  tv.tv_usec := 0;
  repeat
    FD_Zero(FDSet);
    FD_Set(Sct,FDSet);
    Res := Select(0,nil,@FDSet,nil,@tv); // Проверка готовности сокетов
    if Res = 0
      then begin MessageClient(msgSendTimeout, 0); exit; end;
    if Res > 0 then begin
      if FD_IsSet(Sct,FDSet) then begin
 if LenData > 4096 then Len := 4096 else Len := LenData;
 Len := Send(Sct, Data[Offs], Len, 0);
 if (Len <> SOCKET_ERROR)and(Len<>0) then begin
    inc(Offs, Len);
    dec(LenData, Len);
 end else begin
   MessageClient(msgWSAError, WSAGetLastError);
   exit;
 end;
      end;
    end else begin
      MessageClient(msgWSAError, WSAGetLastError);
      exit;
    end;
  until LenData = 0;
  Result := LenData = 0;
end;


NikNet   (2005-05-08 06:59:00) [5]

XProger
Спасибо тебе
А также другим =))))))

XProger ©
А она будет работать с HTTP протоколами?
Мне вобщето для запросов?

Помогите...


XProger   (2005-05-08 04:13:00) [6]

Вот такое на UDP должно работать. На TCP при больших пакетах могут быть бяки... :)

procedure SendTxt(txt: string);
begin
send(s, txt[1], Length(txt), 0);
end;

function RecvTxt: string;
var
len : Byte;
begin
SetLength(Result, 255);
len := recv(s, Result[1], 255, 0);
SetLength(Result, len)
end;


NikNet   (2005-05-07 15:40:00) [7]

Ozone ©  
Мне надо сделать RecvTxt как SendTxt вот  и не получается :(
Вот так:

Function SendPort(port:word; ip,txt:string):String;
Var
D:TWSAData;
S:TSocket;
A:TSockAddr;

Function SendTxt(txt:String):Boolean;
Var
Buffer:array of char;
Begin
SetLength(Buffer, Length(txt));
Move(txt[1], Buffer[0], Length(txt));
send(S, Buffer[0], Length(txt), 0);
end;

Begin
 IF WSAStartup($101,D) = 0 Then
 A.sin_family:=AF_INET;
 A.sin_addr.S_addr:=inet_addr(pchar(ip));
 S:=socket(AF_INET,SOCK_STREAM,0);
 if S<>INVALID_SOCKET then
 A.sin_port:=htons(port);
 if connect(S,A,sizeof(A))=0 then
 Begin
 //========================================
   SendTxt(txt);
   Result:=RecvTxt;
 //========================================
 end;
 closesocket(s);
 WSACleanup;
 end;
Как?

atruhin ©
Я плохо знаю Socket(ы) но мне это надо пожауйста сделайте :(
помогите???

И ещё где можно взять хороши на русском языке учебник работы сокетами? (Плизз)


atruhin   (2005-05-07 13:26:00) [8]

Во первых у тебя в принципе не правильный способ отправки данных. Посмотри хотя бы внимательно конференцию, эти вопросы возникают почти каждый день.
1. send - это функция, а не процедура.
2. как на клиенте ты определишь, окончание строки?
3. Зачем здесь вообще нужен буфер - Buffer:array of char;


Ozone   (2005-05-07 08:36:00) [9]

Вопрос-то собсно в чем?


Наверх

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