unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock, StdCtrls;
const
WM_SocketEvent = WM_USER +
1
;
type
TForm1 =
class
(TForm)
Memo1: TMemo;
procedure
FormCreate(Sender: TObject);
procedure
FormDestroy(Sender: TObject);
private
ServSock: TSocket;
aBuf :
array
of
char
;
procedure
WMSocketEvent(
var
msg: TMessage); message WM_SocketEvent;
procedure
send_to_client(p_sock: TSocket);
public
end
;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure
TForm1
.
FormCreate(Sender: TObject);
var
Data: TWSAData;
Addr
: TSockAddr;
begin
WSAStartup(
$101
, Data);
ServSock := Socket(AF_Inet, Sock_Stream, IPPROTO_IP);
if
ServSock = INVALID_SOCKET
then
ShowMessage(
'Îøèáêà'
);
Addr
.
sin_family := AF_Inet;
Addr
.
sin_addr
.
S_addr := inet_addr(
'127.0.0.1'
);
Addr
.
sin_port := HToNS(
3320
);
FillChar(
Addr
.
sin_zero, SizeOf(
Addr
.
sin_zero),
0
);
Bind(ServSock,
Addr
, SizeOf(TSockAddr));
Listen(ServSock, SOMaxConn);
WSAAsyncSelect(ServSock, Handle, WM_SocketEvent, FD_Read
or
FD_Accept
or
FD_Connect
or
FD_Close);
end
;
procedure
TForm1
.
WMSocketEvent(
var
msg: TMessage);
var
Sock: TSocket;
SockError:
integer
;
SockName : TSockAddr;
vSize:
integer
;
vBuf:
string
;
BufSize :
integer
;
begin
Sock := TSocket(msg
.
WParam);
SockError := WSAGetSelectError(msg
.
LParam);
if
SockError <>
0
then
begin
ShowMessage(
'Îøèáêà'
);
CloseSocket(Sock);
Exit;
end
;
vSize := SizeOf(TSockAddr);
GetPeerName(Sock, SockName, vSize);
case
WSAGetSelectEvent(msg
.
LParam)
of
FD_Read:
begin
vSize := recv(Sock,aBuf[
0
],BufSize,
0
);
if
vSize <=
0
then
exit;
SetLength(vBuf,vSize);
lstrcpyn(@vBuf[
1
],@aBuf[
0
],vSize +
1
);
Memo1
.
Lines
.
Add(format(
'Received from client: %s'
,[vBuf]));
send_to_client(Sock);
end
;
FD_Accept:
begin
Sock := Accept(ServSock,
nil
,
nil
);
vSize := SizeOf(TSockAddr);
GetPeerName(Sock, SockName, vSize);
Memo1
.
Lines
.
Add(format(
'Client accepted, remote address [%s].'
,[inet_ntoa(SockName
.
sin_addr)]));
vSize := sizeOf(BufSize);
getsockopt(Sock,SOL_SOCKET,SO_RCVBUF,
PChar
(@BufSize),vSize);
Memo1
.
Lines
.
Add(format(
'Receive buffer size [%d]'
,[BufSize]));
SetLength(aBuf,BufSize);
end
;
FD_Close:
begin
Shutdown(Sock, SD_Send);
Memo1
.
Lines
.
Add(format(
'Client closed, remote address [%s].'
,[inet_ntoa(SockName
.
sin_addr)]));
CloseSocket(Sock);
end
;
end
;
end
;
procedure
TForm1
.
send_to_client(p_sock: TSocket);
var
buf:
string
;
begin
buf :=
'asdasd'
;
if
send(p_sock,buf[
1
],Length(buf),
0
) = SOCKET_ERROR
then
ShowMessage(
'Îøèáêà'
);
end
;
procedure
TForm1
.
FormDestroy(Sender: TObject);
begin
CloseSocket(ServSock);
WSACleanup;
end
;
end
.