Консольный чат на WinSock
Доброго времени суток. В общем есть консольный чат на WinSock, но проблема такая:обмениваться сообщениями сервер может только с одним клиентом (при этом подключаться могут несколько клиентов, но после первого клиента, сервер не видит сообщения следующих клиентов). Как реализовать, чтобы сервер мог сразу с несколькими клиентами "общаться"?
Клиент:
Код:
unit Unit1;
{$APPTYPE CONSOLE}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock;
const
Port: Integer = 82;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
WSAData: TWSAData;
ClientSocket: TSocket;
ClientAddr: TSockAddr;
Status, ret: Integer;
Buffer1,buffer2: array[0..1024] of Char;
ip, adress : string;
implementation
{$R *.dfm}
begin
Writeln('IP: ');
Readln(ip);
adress := ip;
Writeln('client');
Status:=WSAStartup($0101,WSAData);
ClientSocket:=socket(AF_INET,SOCK_STREAM,0);
ClientAddr.sin_family:=AF_INET;
ClientAddr.sin_port:=htons(Port);
ClientAddr.sin_addr.S_addr:=inet_addr(PAnsiChar(adress));
Status:=connect(ClientSocket,ClientAddr,SizeOf(ClientAddr));
while True do
begin
Readln(Buffer1);
ret:=send(ClientSocket,Buffer1,SizeOf(Buffer1),0);
ret:=recv(ClientSocket,Buffer2,SizeOf(Buffer2),0);
Writeln('Server:',Buffer2);
end;
end.
Сервер:
Код:
unit Unit1;
{$APPTYPE CONSOLE}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
WSAData: TWSAData;
ServerSocket,ClientSocket: TSocket;
ServerAddr, ClientAddr: TSockAddr;
ClientAddrSize,Status,ret: Integer;
Buffer1,buffer2: array[0..1024] of Char;
implementation
{$R *.dfm}
begin
writeln('server');
WSAStartup($0101,WSAData);
ServerSocket:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
ServerAddr.sin_family:=AF_INET;
ServerAddr.sin_port:=htons(82);
ServerAddr.sin_addr.S_addr:=INADDR_ANY;
bind(ServerSocket,ServerAddr,SizeOf(ServerAddr));
listen(ServerSocket,10);
ClientAddrSize:=SizeOf(ClientAddr);
ClientSocket:=accept(ServerSocket,@ClientAddr,@ClientAddrSize);
if ClientSocket <> INVALID_SOCKET then
begin
while True do
begin
ret:=recv(ClientSocket,Buffer2,SizeOf(Buffer2),0);
Writeln('Client:',Buffer2);
Readln(Buffer1);
ret:=send(ClientSocket,Buffer1,SizeOf(Buffer1),0);
end;
end;
end.
|