Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

Сетевая программа на чистом WinSock   Найти похожие ветки 

 
Бульдозер ©   (2005-01-13 22:19) [0]

Как сделать сетевую программу (чат или что-нибудь простое) через чистый WinSock.
Зараннее спасибо


 
Verg ©   (2005-01-13 22:43) [1]

Чт0-нибудь пр0стое:

program EchoServer;

{$APPTYPE CONSOLE}

uses
 Windows,
 Winsock,
 Classes,
 SysUtils;

var
WSAData : TWSAData;
SSocket : TSocket;
LAddr   : TSockAddrIn;
Fds,
Rfds : TFDSet;
I : integer;

function ToOem(const S : string):string;
begin
 Result := S;
 if Result<>"" then
   CharToOemBuff(pchar(Result), pchar(Result), length(Result));
end;

procedure PrintErr(Err : DWORD; Wt : boolean);
begin
 Writeln(ToOem(SysErrorMessage(Err)));
 if Wt then ReadLn;
end;

procedure ExitErr;
begin
 if (WSAGetLastError<>NO_ERROR) and
    (WSAGetLastError<>WSAENOTSOCK) and
    (WSAGetLastError<>WSAEINTR) then
   PrintErr(WSAGetLastError, true);
 if SSocket<> INVALID_SOCKET then
   CloseSocket(SSocket);
 if WSAData.wVersion <> 0 then
   WSACleanup;
 halt(0);
end;

function checksocket(Ret : integer):integer;
begin
 Result := Ret;
 if Result = SOCKET_ERROR then
   ExitErr
end;

procedure DoClose( S : TSocket );
begin
 if S = INVALID_SOCKET then exit;
 FD_CLR(S, Fds);
 if CloseSocket(S) = SOCKET_ERROR then
   PrintErr(WSAGetLastError, false);
end;

procedure DoAccept( S : TSocket );
begin
 if S <> INVALID_SOCKET then
 begin
   if Fds.fd_count < FD_SETSIZE then
     FD_SET( S, Fds )
   else
     if CloseSocket(S) = SOCKET_ERROR then
       PrintErr(WSAGetLastError, false);
 end else
   PrintErr(WSAGetLastError, false);
end;

procedure DoRead(S : TSocket);
var Res : integer;
   Buffer : array[0..255] of byte;
begin
 Res := recv(S, Buffer[0], sizeof(Buffer), 0);
 if Res > 0 then
   Res := send(S, Buffer[0], Res, 0);
 if Res <= 0 then
 begin
   if Res < 0 then
     PrintErr(WSAGetLastError, false);
   DoClose(S);
 end;
end;

var PH : PHostEnt;
   Adr : ^PInAddr;
begin
 SSocket := socket(PF_INET, SOCK_STREAM, 0);
 if SSocket = INVALID_SOCKET then ExitErr;
 FillChar(LAddr, sizeof(LAddr), 0);
 LAddr.sin_family := AF_INET;
 LADDR.sin_port   := htons(8088);
 LAddr.sin_addr.S_addr := htonl(INADDR_ANY);
 checksocket( bind(SSocket, LAddr, sizeof(LAddr)) );
 checksocket( listen(SSocket, SOMAXCONN) );
 FD_ZERO( Fds );
 FD_SET( SSocket, Fds );
 Repeat
   RFds := Fds;
   checksocket( select(0, @RFds, nil, nil, nil) );
   for I:=0 to RFds.fd_count -1 do
   begin
     if RFDs.fd_array[I] = SSocket then
       DoAccept( accept( SSocket, nil, nil ) )
     else
       DoRead(RFDs.fd_array[I]);
   end;
 until False;
end.


:))))


 
Бульдозер ©   (2005-01-14 21:57) [2]

Спасибо, это работает (только зачем PH и Adr?), но как сделать сервера?



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.04 c
3-1108642779
Max Zyuzin
2005-02-17 15:19
2005.03.20
Обращаемся к *.dbf файлам через ADO


1-1109845180
DICE
2005-03-03 13:19
2005.03.20
Про графики


6-1106218936
Kirill
2005-01-20 14:02
2005.03.20
Декодировать MIME письмо


8-1101746085
PitBult
2004-11-29 19:34
2005.03.20
Как записать в AVI всё что происходит на экране?


1-1109951514
Paul__
2005-03-04 18:51
2005.03.20
Сгенерировать уникальное имя для компонента в пределах приложения