WINAPI сокеты
Здравствуйте. Помогите, пожалуйста. Есть сервер и клиент, сервер передает клиенту строку, но строка приходит на сервер ввиде символов-иероглифов. Уже совсем измучилась... В чем ошибка?
Код сервера
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, winsock, StdCtrls;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
porttext: TEdit;
maxcon: TEdit;
ListBox1: TListBox;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
buff: string ; //временный буфер
mysocket: TSOCKET; //собсно сам сокет
work:boolean; //работает ли сервер?
port:UINT ;
local_addr: sockaddr_in ; //параметры сокета сервера
h: THANDLE;
max_con, real_con:integer ;
Form1: TForm1;
st:char;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var D:WSADATA;
begin
if (WSAStartup($101,D))<>0//проинициализировать процесс библиотеки wsock32.dll
then MessageBox(0,'Невозможна инициализация WSA','Ошибка',MB_OK or MB_SYSTEMMODAL);
porttext.Text:='12345';
work:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
p:String;
thID:LongWord;
i:integer;
client_socket:TSOCKET ; // сокет для клиента
client_addr:sockaddr_in ; // адрес клиента (заполняется системой)
client_addr_size:integer;
h:pHTR;
st:String;
begin
p:=porttext.Text;
port:=StrToInt(p);
max_con:=StrToInt(maxcon.Text);
//если сервер не запущен - пытаемся запустить его
mysocket:=socket(AF_INET,SOCK_STREAM,0);
if (mysocket<0)then//интернетовский,потоковый,TCP
exit;
local_addr.sin_family:=AF_INET;
local_addr.sin_port:=htons(port); // не забываем о сетевом порядке!!!
local_addr.sin_addr.s_addr:=0; // сервер принимает подключения
// на все свои IP-адреса
// вызываем bind для связывания
if bind(mysocket,local_addr, sizeof(local_addr))<>0 then
exit;
if listen(mysocket, SOMAXCONN)<>0 then //2-макс допустимый размер очереди
exit;
ListBox1.Items.Add('Start');
client_addr_size:=sizeof(client_addr);
client_socket:=accept(mysocket,@client_addr,@client_addr_size);
if client_socket<>INVALID_SOCKET then
begin
ListBox1.Items.Add('Ura!!!');
st:='123456';
Send(client_socket,st,Length(st),0);
end;
closesocket(mysocket);
//WSACleanup();
Button1.Caption:='Connect';
ListBox1.Items.Add('Сервер остановлен');
work:=false;
end;
end.
Код клиента
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, winsock, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
iptext: TEdit;
porttext: TEdit;
Message: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure MessageClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
buff: String; //временный буфер
connected_now:boolean;
file_now:boolean;
mysocket:TSOCKET; //собсно сам сокет
local_addr:sockaddr_in; //параметры сокета сервера
h:THANDLE;
port:UINT;
adr,st1:String;
st2:String;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var D:WSADATA;
begin
connected_now:=false;
file_now:=false;
port:=12345;
if (WSAStartup($101,D))<>0//проинициализировать процесс библиотеки wsock32.dll
then MessageBox(0,'Невозможна инициализация WSA','Ошибка',MB_OK or MB_SYSTEMMODAL);
end;
procedure TForm1.Button1Click(Sender: TObject);
var p,a:String;
dest_addr:sockaddr_in;
hst:^HOSTENT;
st:integer;
st1:String;
begin
p:=porttext.Text;
port:=StrToInt(p);
iptext.Text:='192.168.1.2';
a:=iptext.Text;
if(not connected_now) then
begin
mysocket:=socket(AF_INET,SOCK_STREAM,0);
if (mysocket<0)then//интернетовский,потоковый,TCP
begin
MessageBox(0,'Невозможно создать сокет','Ошибка',MB_OK or MB_SYSTEMMODAL);
WSACleanup();
end;
//определяем параметры соединения
dest_addr.sin_family:=AF_INET;
dest_addr.sin_port:=htons(port);
// преобразование IP адреса из символьного в сетевой формат
if (inet_addr(pchar(a))<>INADDR_NONE) then
dest_addr.sin_addr.s_addr:=inet_addr(pchar(a))
else
begin
MessageBox(0,'Невозможно соединиться с сервером','Ошибка',MB_OK or MB_SYSTEMMODAL);
closesocket(mysocket);
WSACleanup();
end;
st:=connect(mysocket,dest_addr,sizeof(dest_addr));
if (st=-1) then
begin
MessageBox(0,'Ошибка при создании соединения','Error',MB_OK);
closesocket(mysocket); // закрываем сокет!
WSACleanup();
end;
Edit1.Text:=IntToStr(recv(mysocket,st2,6,0));
Edit1.Text:=st2;
Button1.Caption:='Disconnect';
connected_now:=true;
end
else
begin
closesocket(mysocket);
Button1.Caption:='Connect';
connected_now:=false;
end;
end;
Admin: Читай правила форума по оформлению кода!
И нет ли у кого-нибудь примеров, как передавать файлы, чтоб сокеты были неблокирующие?
|