Шустрый
Профиль
Группа: Участник
Сообщений: 83
Регистрация: 6.5.2005
Где: Russia
Репутация: нет Всего: 1
|
RaIDeR, ты был прав, функция возвращает не ноль (похоже что в книжке ошибка)... Твой пример не работал потому что я не указал размер структуры... Код | addr1_len := SizeOf(addr1);
|
Вот рабочий сервер: Код | unit MainUnitServer;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Winsock, ExtCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; WSA : TWSAData; sock1 : TSocket; sock2 : TSocket; addr : sockaddr_in; addr1 : sockaddr_in; addr1_len : u_int; buff : array [1..25] of Char; b : u_int; l : u_int;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Clear; if WSAStartup($101, WSA) <> 0 then begin MessageBox(Form1.Handle, 'Error WSAStartup', 'Message', MB_ICONERROR); WSACleanup; Halt; end; addr.sin_family := AF_INET; addr.sin_port := htons(7500); addr.sin_addr.S_addr := INADDR_ANY; sock1 := Socket(AF_INET, SOCK_STREAM, 0); if sock1 = INVALID_SOCKET then MessageBox(Form1.Handle, 'Error Socket', 'Message', MB_ICONERROR); b := bind(sock1, addr, SizeOf(addr)); if b = SOCKET_ERROR then MessageBox(Form1.Handle, 'Error Bind', 'Message', MB_ICONERROR); l := listen(sock1, SoMaxConn); if l = SOCKET_ERROR then MessageBox(Form1.Handle, 'Error Listen', 'Message', MB_ICONERROR); Timer1.Enabled := False; end;
procedure TForm1.Button2Click(Sender: TObject); begin addr1_len := SizeOf(addr1); repeat sock2 := accept(sock1, @addr1, @addr1_len); if sock2 <> INVALID_SOCKET then Memo1.Lines.Add('Client connected...'); until sock2 <> INVALID_SOCKET; Timer1.Enabled := True; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if recv(sock2, buff, SizeOf(buff), 0) > 0 then begin Memo1.Lines.Add('Received: ' + buff); FillChar(buff, SizeOf(buff), #0); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin CloseSocket(sock1); CloseSocket(sock2); WSACleanup; Form1.Close; end;
end.
|
Клиент: Код | unit MainUnitClient;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Winsock;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; WSA : TWSAData; clientsocket : TSocket; addr : sockaddr_in; c : u_int; buff : String;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Clear; if WSAStartup($101, WSA) <> 0 then begin MessageBox(Form1.Handle, 'WSAStartup error', 'Message', MB_ICONERROR); WSACleanup; Halt; end; addr.sin_family := AF_INET; addr.sin_port := htons(7500); addr.sin_addr.S_addr := inet_addr('127.0.0.1'); end;
procedure TForm1.Button1Click(Sender: TObject); begin clientsocket := Socket(AF_INET, SOCK_STREAM, 0); if clientsocket = INVALID_SOCKET then MessageBox(Form1.Handle, 'Socket error', 'Message', MB_ICONERROR); c := connect(clientsocket, addr, SizeOf(addr)); if c = SOCKET_ERROR then MessageBox(Form1.Handle, 'Connect error', 'Message', MB_ICONERROR) else MessageBox(Form1.Handle, 'Connect Done', 'Message', MB_ICONINFORMATION); end;
procedure TForm1.Button2Click(Sender: TObject); var s : u_int; begin buff := Memo1.Text; s := send(clientsocket, buff[1], Length(buff), 0); if s <= 0 then MessageBox(Form1.Handle, 'Message Not Send', 'Message', MB_ICONERROR) else MessageBox(Form1.Handle, 'Message Send', 'Message', MB_ICONINFORMATION); end;
procedure TForm1.Button3Click(Sender: TObject); begin CloseSocket(clientsocket); WSACleanup; Form1.Close; end;
end.
|
|