Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Люди помогите сделать RECV что-то у меня не получается?   Найти похожие ветки 

 
NikNet ©   (2005-05-06 23:40) [0]

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;


 
Ozone ©   (2005-05-07 08:36) [1]

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


 
atruhin ©   (2005-05-07 13:26) [2]

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


 
NikNet ©   (2005-05-07 15:40) [3]

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(ы) но мне это надо пожауйста сделайте :(
помогите???

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


 
XProger ©   (2005-05-08 04:13) [4]

Вот такое на 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-08 06:59) [5]

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

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

Помогите...


 
atruhin ©   (2005-05-08 13:47) [6]

>> А она будет работать с 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;


 
XProger ©   (2005-05-08 17:21) [7]

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

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;


 
NikNet ©   (2005-05-09 03:34) [8]

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


 
atruhin ©   (2005-05-09 10:02) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
14-1122490026
Dimedrol
2005-07-27 22:47
2005.08.21
Bluetooth


11-1105695193
DmiSb
2005-01-14 12:33
2005.08.21
Печать страницы Excel не показывая самого Excel ?


11-1105566860
koller
2005-01-13 00:54
2005.08.21
FormatFloat


14-1122633612
Vlad Oshin
2005-07-29 14:40
2005.08.21
как работает корень квадратный?


4-1119986951
Ванечка
2005-06-28 23:29
2005.08.21
Права админа