|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Консольный чат на 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. |
#2
|
||||
|
||||
так accept не один раз надо вызывать
Пишу программы за еду. __________________ |