pascalabcnet/bin/Lib/Sockets.pas
Бондарев Иван 59169b5168 ...
2015-06-27 18:33:50 +02:00

107 lines
2.6 KiB
ObjectPascal

// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
unit Sockets;
{$reference 'System.dll'}
interface
function CreateServerSocket(port: integer) : integer;
function Accept(sock: integer) : integer;
procedure ReceiveString(sock : integer; var s : string);
procedure CloseSocket(sock : integer);
function CreateClientSocket : integer;
function Connect(sock : integer; ip_addr : string; port : integer) : boolean;
procedure SendString(sock : integer; s : string);
implementation
uses System, System.Net, System.Net.Sockets, System.IO;
type TByteArray = array of byte;
var hts : System.Collections.Hashtable;
htc : System.Collections.Hashtable;
htsc : System.Collections.Hashtable;
num_sock := 0;
//num_srv_clnt : integer=0;
bytes : TByteArray;
function CreateServerSocket(port: integer) : integer;
var server : TCPListener;
begin
server := TCPListener.Create(IPAddress.Parse('127.0.0.1'),port);
server.Start;
hts[num_sock] := server;
Result := num_sock;
Inc(num_sock);
end;
function CreateClientSocket : integer;
var client : TCPClient;
begin
client := TCPClient.Create;
htc[num_sock] := client;
Result := num_sock;
Inc(num_sock);
end;
function Accept(sock: integer) : integer;
var client : TCPClient;
begin
client := (hts[sock] as TCPListener).AcceptTCPClient;
htsc[num_sock] := client;
Result := num_sock;
Inc(num_sock);
end;
procedure SendString(sock : integer; s : string);
var buf : NetworkStream;
client : TCPClient;
begin
client := htc[sock] as TCPClient;
buf := client.GetStream;
buf.Write(System.Text.Encoding.ASCII.GetBytes(s),0,s.Length);
end;
procedure ReceiveString(sock : integer; var s : string);
var buf : NetworkStream;
client : TCPClient;
len : integer;
begin
client := htsc[sock] as TCPClient;
buf := client.GetStream;
len := buf.Read(bytes,0,bytes.Length);
s := System.Text.Encoding.ASCII.GetString(bytes, 0, len);
end;
procedure CloseSocket(sock : integer);
var o : System.Object;
begin
o := hts[sock];
if o <> nil then (TCPListener(o)).Stop
else
begin
o := htc[sock];
if o <> nil then (TCPClient(o)).Close
else
begin
o := htsc[sock];
if o <> nil then (TCPClient(o)).Close;
end;
end
end;
function Connect(sock : integer; ip_addr : string; port : integer) : boolean;
begin
(htc[sock] as TCPClient).Connect(ip_addr,port);
Result := true;
end;
initialization
htc := new System.Collections.Hashtable;
hts := new System.Collections.Hashtable;
htsc := new System.Collections.Hashtable;
bytes := TByteArray(System.Array.CreateInstance(typeof(byte),1024));
end.