всем снова привет. есть консольное приложение на winsock на подобии чата
http://articles.org.ru/cfaq/index.php?qid=2207 Код: program winsock_server;
//Простейшее приложение-сервер.
//Сокеты работают в блокирующем режиме.
//На каждое соединение создается отдельный поток.
{$apptype console}
uses
sysutils,
winsock,
windows;
var
vwsadata : twsadata;
vlistensocket,vsocket : tsocket;
vsockaddr : tsockaddr;
trid : thandle;
const
cport = word(33);
csigexit = 'q';
//Процедура отдельного потока для каждого клиента.
procedure socketthread;
var sockname : tsockaddr;
abuf : array of char;
vbuf : string;
vsize : integer;
s :tsocket;
bufsize : integer;
begin
s := vsocket;
if s = invalid_socket then exit;
vsize := sizeof(tsockaddr);
getpeername(s, sockname, vsize);
writeln(format('client accepted, remote address [%s].',[inet_ntoa (sockname.sin_addr)]));
//Определяем размер буфера чтения для сокета
vsize := sizeof(bufsize);
getsockopt(s,sol_socket,so_rcvbuf,pchar(@
bufsize),vsize);
writeln(format('receive buffer size [%d]',[bufsize]));
setlength(abuf,bufsize);
repeat
//Получаем данные. Процедура работает в блокирующем режиме,
//таким образом следующая строка кода не получит управление,
//пока не поступят данные от клиента.
vsize := recv(s,abuf[0],bufsize,0);
if vsize<=0 then break;
setlength(vbuf,vsize);
lstrcpyn(@vbuf[1],@abuf[0],vsize);
writeln(format('received from cleint: %s',[vbuf]));
until vbuf = 'q';
writeln(format('client disconnected, remote address [%s].',[inet_ntoa(sockname.sin_addr)]));
setlength(abuf,0);
closesocket(s);
end;
begin
writeln('starting application...');
//Объявляем, что программа будет использовать windows sockets.
if wsastartup($101,vwsadata)<>0 then halt(1);
writeln('using windows sockets.');
//Создаем прослушивающий сокет.
vlistensocket := socket(af_inet,sock_stream,ipproto_ip);
writeln(format('creating socket on port [%d].',[cport]));
if vlistensocket = invalid_socket then halt(1);
fillchar(vsockaddr,sizeof(tsockaddr),0);
vsockaddr.sin_family := af_inet;
vsockaddr.sin_port := htons(cport);
vsockaddr.sin_addr.s_addr := inaddr_any;
writeln('binding socket...');
//Привязываем адрес и порт к сокету.
if bind(vlistensocket,vsockaddr,sizeof(tsockaddr)) <> 0
then halt(1);
//Начинаем прослушивать.
if listen(vlistensocket,somaxconn) <> 0
then halt(1);
writeln('socket status: listening.');
repeat
//Ожидаем подключения.
vsocket := accept(vlistensocket,nil,nil);
//Клиент подключился, запускаем новый процесс на соединение.
createthread(nil,0,@socketthread,0,0,trid);
until false;
closesocket(vlistensocket);
wsacleanup;
end.