Тема: WinSock
Показать сообщение отдельно
  #2  
Старый 19.08.2009, 17:43
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 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" (Э. Джонс, Д. Оланд). Читаю, детально все описано.
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием