Главная страница
    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.47 MB
Время: 0.033 c
14-1122376452
BiN
2005-07-26 15:14
2005.08.21
За использование смайликов придется платить Microsoft


14-1122586617
Petr V. Abramov
2005-07-29 01:36
2005.08.21
Я почти уверен в победе революции в России


4-1117836874
Вадим Станкевич
2005-06-04 02:14
2005.08.21
Как отловить открытие/закрытие дверцы CD-ROM?


4-1119610541
DelphiN!
2005-06-24 14:55
2005.08.21
Вызов процедуры основного модуля из потока


14-1122448428
MaximkaP
2005-07-27 11:13
2005.08.21
Тонкости договоров с провайдерами.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский