
19.08.2009, 17:43
|
 |
Начинающий
|
|
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
|
|
Тоже буквально на днях сделал по примеру криса эхо-сервер. Отлично все работает.
Код:
program wsServer;
{$APPTYPE CONSOLE}
uses
Windows,
WinSock;
const
hello_message = 'Hello!'#0;
var
ClientsCount : Integer = 0;
DefaultPort : Cardinal = 666;
//Для каждого подключения создается поток
function ClientThread( client_socket : Pointer) : DWORD; stdcall;
var
sock : TSocket;
buff : array [0..1024] of char;
bytes_recv : Integer;
b : Byte;
begin
sock := pInteger(client_socket)^;
//выводим приглашение
buff := 'hi';
send(sock, buff, 3, 0);
//цикл обработки сообщений
repeat
bytes_recv := recv(sock, buff, 1024, 0);
if bytes_recv = 0 then Break;
send(sock, buff, bytes_recv, 0);
until false;
//при разрыве соединения клиентом цикл завершается
Writeln('Dosconnect');
closesocket(sock);
end;
procedure Main;
var
buff : array[0..1024] of Char;
wsadat : TWSAData;
Socket : TSocket;
local_addr : sockaddr_in;
client_socket : TSocket;
client_addr : sockaddr_in;
client_addr_size : Integer;
hst : HOSTENT;
thID : Cardinal;
begin
Writeln('TCP SERVER');
//инициализация
if WSAStartup($0202, wsadat) <> 0 then
begin
Writeln('WSAStartup error #', WSAGetLastError);
Readln;
Exit;
end;
//создание сокета
Socket := WinSock.socket(AF_INET, SOCK_STREAM, 0);
if Socket < 0 then
begin
Writeln('socket error #', WSAGetLastError);
Readln;
Exit;
end;
//связывание сокета с локальным адресом
local_addr.sin_family := AF_INET;
local_addr.sin_port := htons(DefaultPort);
local_addr.sin_addr.s_addr := 0;
if Bind(Socket, local_addr, SizeOf(local_addr)) <> 0 then
begin
Writeln('Bind error #', WSAGetLastError);
Readln;
Exit;
end;
//ожидание подключений
if listen(Socket, $100) <> 0 then
begin
Writeln('Socket error #', WSAGetLastError);
Readln;
Exit;
end;
WriteLn('Wait for connections');
//извлекаем сообщение из очереди
client_addr_size := Sizeof(client_addr);
//ожидание подключений
repeat
client_socket := accept(Socket, @client_addr, @client_addr_size);
if client_socket = 0 then Break;
Writeln('Connect');
CreateThread(nil, 0, @ClientThread, @client_socket, 0, thID); //@client_socket лучше заменить на Pointer(client_socket) и в процедуре потока исправить, а то мало ли - затрется.
until false;
end;
begin
Main
end.
Сейчас скачал "Программирование в сетях Microsoft Windows" (Э. Джонс, Д. Оланд). Читаю, детально все описано.
__________________
...сказал, и загрустил от бесспорной своей правоты
|