Текущий архив: 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