|
|
#1
|
|||
|
|||
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: Читай правила форума по оформлению кода! И нет ли у кого-нибудь примеров, как передавать файлы, чтоб сокеты были неблокирующие? Последний раз редактировалось Admin, 06.04.2008 в 19:45. |
#2
|
||||
|
||||
Вот тебе книга http://depositfiles.com/ru/files/1250661
Вот тебе диск к книге http://depositfiles.com/ru/files/1252195 Там ты найдёшь ответы на свои вопросы и узнаешь то, чего до этого может быть и не знал о сокетах. Фленов М. своё дело знает ) |
#3
|
|||
|
|||
White_Horse, спасибо Вам огромное!!! Так подробно все написано, и на дельфи)))))) нигде такого найти не могла. Спасибо!!!
|
#4
|
||||
|
||||
А на диске троян... DISK\Sources\ch02\WinAPI\WinAPIProject.exe
Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#5
|
||||
|
||||
Цитата:
|