Не могу понять в чем трабла... только начал изучать: Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, winsock, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var wData : WSAData; s : TSOCKET; addr : sockaddr_in; sendbuff, recvbuff : array [0..5000] of Char; begin WSAStartup($101,wData); s := socket(AF_INET, SOCK_STREAM, 0); addr.sin_family:=AF_Inet; addr.sin_port:=htons(80); addr.sin_addr.S_addr:=inet_addr('87.240.188.251'); {коннектимся} Connect(S, addr, SizeOf(TSockAddr)); sendbuff := 'GET / HTTP/1.1'+ #13#10 + 'Host: 87.240.188.251'+ #13#10 + 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FDM)'+ #13#10 + 'Accept: text/html'+ #13#10 + 'Accept-Charset: windows-1251'+ #13#10 + 'Connection: close'+#13#10+ #13#10; {шлем запрос} send(s, sendbuff, Length(sendbuff), 0); {считываем ответ} recv(s, recvbuff, Length(recvbuff), 0); { выводим } Memo1.Lines.Add(recvbuff); { закрываемся } WSACleanup; closesocket(s); end; end. Возвращает баян какой то Так и должно быть? P.S. поисковал на форуме на тему "recv" ничего подобного не нашёл....
recv(s, recvbuff, Length(recvbuff), 0); и с каких это порт размер буфера вычисляется как блина строки? т.е. буфер и там ничего нет то и размер нулевой. sizeof юзай. Если для посылки данных - всё норм считаешь, скока данных запихнул такой длинны и строка, то для получения размера буфера будет 0 в таком случае. И проверять что вернула connect и recv
Вообщето в recv передается не размер данных, а емкость буфера. То есть если в буфер можно поместить 5000 байт (которые автором ошибочно названы чарами), то и передается 5000. Так что все верно
Code: sendbuff := 'GET /index.php HTTP/1.1'+ #13#10 + 'Host: 87.240.188.251'+ #13#10 + 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FDM)'+ #13#10 + 'Accept: text/html'+ #13#10 + 'Accept-Charset: windows-1251'+ #13#10 + 'Connection: close'+#13#10+ #13#10; {шлем запрос} send(s, sendbuff, Length(sendbuff), 0); {считываем ответ} recv(s, recvbuff, SizeOf(recvbuff), 0); { выводим } Memo1.Lines.Add(recvbuff); тоже самое!
Попробуй в host записать vkontakte.ru И самое главное чего ты не делаешь - очистку буферов: FillChar(sendbuf[0], 5001, 0); перед записью в него данных FillChar(recvbuf[0], 5001, 0); перед получением данных
Возможно ли через что нить посмотреть что я отсылаю и что мне присылают?! HTTPAnalyzer не берёт только что попробовал... не прёт
SizeOf как раз и возвращает "емкость" буфера. Правильно не Code: send(s, sendbuff, Length(sendbuff), 0); а Code: send(s, sendbuff[0], SizeOf(sendbuff), 0); не Code: recv(s, recvbuff, SizeOf(recvbuff), 0); а Code: recv(s, recvbuff[0], SizeOf(recvbuff), 0);
Chrome~, Length тоже вернет "емкость" буфера. Можете проверить. recvbuff[0] - это просмотрел. Действительно. Kandi, обновил свой предыдущий пост. Ну и еще по-хорошему надо не весь буфер отсылать, а только по размеру данных.
Всё именно так и сделал..ответ к сожалению еироглифный(((( что творить народ? может кодировка какая то? (((
Кстати, может быть. У тебя же 2010 дельфи, а она тока юникодные строки понимает Пы.Сы. Итог таков. Хотя указанные нами ошибки и имеют место быть и должны быть исправлены. НО!!! Код приведенный автором абсолютно рабочий, тока что проверил. Автору - либо меняй дельфи на 2007, либо перекодируй все строки в ANSI и обратно. 2010 дельфи работает только с юникодом.
Да у меня 2010. и что мне делать? :О Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, winsock, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var wData : WSAData; s : TSOCKET; addr : sockaddr_in; sendbuff, recvbuff : array [0..5000] of Char; begin WSAStartup($101,wData); s := socket(AF_INET, SOCK_STREAM, 0); addr.sin_family:=AF_Inet; addr.sin_port:=htons(80); addr.sin_addr.S_addr:=inet_addr('87.240.188.251'); {коннектимся} Connect(S, addr, SizeOf(TSockAddr)); sendbuff := 'GET /index.php HTTP/1.1'+ #13#10 + 'Host: vkontakte.ru'+ #13#10 + 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FDM)'+ #13#10 + 'Accept: text/html'+ #13#10 + 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'+ #13#10 + 'Accept-Charset: windows-1251'+ #13#10 + 'Connection: close'+#13#10 + #13#10; {шлем запрос} FillChar(sendbuff, 5001, 0); send(s, sendbuff[0], SizeOf(sendbuff), 0); {считываем ответ} FillChar(recvbuff, 5001, 0); recv(s, recvbuff[0], SizeOf(recvbuff), 0); { выводим } Memo1.Lines.Add(recvbuff); { закрываемся } WSACleanup; closesocket(s); end; end.
Пы.Сы. Итог таков. Хотя указанные нами ошибки и имеют место быть и должны быть исправлены. НО!!! Код приведенный автором абсолютно рабочий, тока что проверил. Автору - либо меняй дельфи на 2007, либо перекодируй все строки в ANSI и обратно. 2010 дельфи работает только с юникодом.
Окей. Всем большое спасибо. Особенно G-Host Code: sendbuff, recvbuff : array [0..5000] of AnsiChar; AnsiChar помог) Всё заработало