Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.04.2008, 19:32
OVN OVN вне форума
Прохожий
 
Регистрация: 06.04.2008
Сообщения: 2
Репутация: 10
По умолчанию 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  
Старый 06.04.2008, 21:19
Аватар для White_Horse
White_Horse White_Horse вне форума
Новичок
 
Регистрация: 28.10.2007
Сообщения: 61
Репутация: 15
По умолчанию

Вот тебе книга http://depositfiles.com/ru/files/1250661
Вот тебе диск к книге http://depositfiles.com/ru/files/1252195
Там ты найдёшь ответы на свои вопросы и узнаешь то, чего до этого может быть и не знал о сокетах.
Фленов М. своё дело знает )
Ответить с цитированием
  #3  
Старый 06.04.2008, 22:32
OVN OVN вне форума
Прохожий
 
Регистрация: 06.04.2008
Сообщения: 2
Репутация: 10
По умолчанию

White_Horse, спасибо Вам огромное!!! Так подробно все написано, и на дельфи)))))) нигде такого найти не могла. Спасибо!!!
Ответить с цитированием
  #4  
Старый 13.04.2008, 10:51
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

А на диске троян... DISK\Sources\ch02\WinAPI\WinAPIProject.exe
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #5  
Старый 13.04.2008, 15:20
Аватар для White_Horse
White_Horse White_Horse вне форума
Новичок
 
Регистрация: 28.10.2007
Сообщения: 61
Репутация: 15
По умолчанию

Цитата:
Сообщение от The Shadow
А на диске троян... DISK\Sources\ch02\WinAPI\WinAPIProject.exe
Незнаю я незаливал эти файлы, просто дал ссылки на них, когда качал я у меня ничего не нашёл NOD32
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter