Добрый день! Помогите пожалуйста с вот таким вопросом Как преобразовать string в формат пригодный для http запросов? При написании простейшего http клиента на основе сокетов(TSocket) возникла вот такая проблема. На любой http запрос, вводимый с клавиатуры в memo1, сервер отвечает 501 metod not implemented(это выводится в memo2 в виде html кода с непонятными символами | ) В процессе многочисленных экспериментов стало понятно, что сервер не понимает кодировки, в которой передается сообщение, а memo2 с ошибками показывает ответ. Само tcp соединение устанавливается без проблем и ошибок. В моей проге данные в сокет вводятся в форме memo1.text, а выводятся в прямо в memo2.text. Данные передаются в сокет функцией send, а принимаются функцией recv.
Я использую прогу USBWebserver(http,smtp,mysql) в качестве в качестве сервера. Вот сам запрос надо передавать целиком либо построчно? Может в этом проблема? Что можете сказать? Вот код:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, StdCtrls, WinSock, ImgList;
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Memo2: TMemo; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject);
private { Private declarations } function lookupname (str:string):TInAddr; function CreateSocket (serverAddress:string; port:integer):TSocket; function SendToSocket (socket:TSocket; str:string):integer; function ReadFromSocket (socket:TSocket):String;
public { Public declarations } end;
var Form1: TForm1; _wData:WSAData; _server_addr:sockaddr_in;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin if WSAStartup(makeword(1,1), _wData) <> 0 then begin ShowMessage('Ошибка при инициализации WinSock. Продолжение невозможно'); Application.Terminate; end else showmessage('OK!library initialized'); end;
function TForm1.lookupname(str: string): TInAddr; var _hostEnt:PHostEnt; _inAddr:TInAddr; begin //Если адрес smtp сервера символьный if (lowerCase(str)[1] IN ['a'..'z']) OR (lowerCase(str)[2] IN ['a'..'z']) then begin //Определяем IP адрес _hostEnt := getHostByName(pchar(str)); //очишаем _inAddr FillChar(_inAddr, sizeOf(_inAddr), 0); if _hostEnt<>nil then begin //Если адрес получен, то получаем его. with _hostEnt^, _inAddr do begin s_un_b.s_b1 := h_addr^[0]; s_un_b.s_b2 := h_addr^[1]; s_un_b.s_b3 := h_addr^[2]; s_un_b.s_b4 := h_addr^[3]; end; end; end else _inAddr.s_addr := inet_addr(pchar(str));
Result:= _inAddr; end; function TForm1.CreateSocket(serverAddress: string; port: integer): TSocket; var _socket:TSocket; begin _socket := Socket(PF_INET, SOCK_STREAM, IPPROTO_IP); if _socket = INVALID_SOCKET then begin
Application.Terminate; end else showmessage('OK, socketcreated');
_server_addr.sin_family := AF_INET; _server_addr.sin_addr.S_addr := htonl (INADDR_ANY); _server_addr.sin_port := htons(port); _server_addr.sin_addr := lookupname(ServerAddress); Result := _socket; end;
function TForm1.SendToSocket(socket: TSocket; str: string):integer;
begin result:=send(socket, str, length(str), 0);
end;
function TForm1.ReadFromSocket(socket: TSocket): String; var _buff:string;
begin Result:=''; recv(socket, _buff, 1024, 0); result:= _buff;
end;
procedure TForm1.Button1Click(Sender: TObject); var _Socket:TSocket;
begin _Socket := CreateSocket('localhost', StrToInt('8080'));
if (Connect(_Socket, _server_addr, sizeOf(_server_addr)) = SOCKET_ERROR) then begin application.Terminate; end else showmessage('Connected!'); sleep(1000); SendToSocket(_socket, memo1.Text);
sleep(1000); memo2.Text:=ReadFromSocket(_socket); CloseSocket(_socket);
end;
end.
|
А вот рисунок, что выдает эта прога:

|