1) Echo Сервер:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, winsock, Types;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
type
TD=array[0..127]of char;
var
wsd:WSADATA;
sListen,sClient:TSOCKET;
iAddrSize,bPort,iPort:integer;
hThread:THANDLE;
dwThreadId:DWORD;
local,client:sockaddr_in;
hhostt:byte;
wt,ok:boolean;
CS:_RTL_CRITICAL_SECTION;
{$R *.dfm}
function ClientThread(lpParam:pointer):DWORD;
var
cClient:TSOCKET;
Data:TD;
ret:integer;
begin
EnterCriticalSection(CS);
cClient:=sClient;
ok:=false;
LeaveCriticalSection(CS);
ret:=recv(cClient,Data,SizeOf(Data),0);
if (ret<>SOCKET_ERROR) then begin
if (wt) then sleep(2000);
ret:=send(cClient, Data,SizeOf(Data),0);
if (ret=SOCKET_ERROR) then begin
MessageDlg('Ошибка отправки пакетов',mtError,[mbOk],0);
end;
end
else if (ret=SOCKET_ERROR) then begin
MessageDlg('Ошибка приема пакетов',mtError,[mbOk],0);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSection(CS);
bPort:=1122;
iPort:=bPort;
if (WSAStartup(MAKEWORD(2,2), wsd)<>0) then begin
MessageDlg('Error starting WinSock',mtError,[mbOk],0);
halt(1);
end;
sListen:= socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if (sListen=SOCKET_ERROR) then begin
MessageDlg('Создание сокета невозможно:'+IntToStr(GetLastError),mtError,[mbOk],0);
halt(1);
end;
local.sin_addr.s_addr:=INADDR_ANY;
local.sin_family:=PF_INET;
local.sin_port:=htons(iPort);
wt:=(ParamCount>0);
if (bind(sListen,local,sizeof(local))=SOCKET_ERROR) then begin
MessageDlg('Порт 1122 уже занят',mtError,[mbOk],0);
halt(1);
end;
listen(sListen, 8);
while (true) do begin
iAddrSize:=sizeof(client);
sClient:=accept(sListen,PSOCKADDR(@client),@iAddrSize);
if (sClient=INVALID_SOCKET) then
begin
MessageDlg('Невозможно принять соеденение',mtError,[mbOk],0);
end;
ok:=true;
hThread:=CreateThread(nil, 0, @ClientThread,nil, 0 , dwThreadId);
while(ok)do;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DeleteCriticalSection(CS);
closesocket(sListen);
WSACleanup();
end;
end.
2) Ping :
program Ping;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, winsock, Types, System;
type
TD=array[1..128]of byte;
var
wsd:WSADATA;
sListen,sClient:TSOCKET;
iAddrSize,bPort,iPort,count,i,j,ec,oc,ep,time,ret:integer;
hThread:THANDLE;
dwThreadId:DWORD;
server:sockaddr_in;
hhostt:byte;
exit,ok:boolean;
Data:TD;
ss:string;
sd:array[1..16]of char;
sp:PAnsiChar;
function TimeT(lpParam:pointer):DWORD;
var
mData:TD;
begin
while (not exit) do begin
sleep(1);
inc(time);
end;
end;
function ClientThread(lpParam:pointer):DWORD;
begin
ret:=recv(sClient,Data,SizeOf(Data),0);
if (ret<>SOCKET_ERROR) then ok:=true;
end;
begin
{ TODO -oUser -cConsole Main : Insert code here }
count:=4;
if ParamCount<1 then begin
writeln('Нет IP адресса, введите: ping ip-adress');
halt(1);
end;
if ParamCount=2 then begin
count:=StrToInt(ParamStr(2));
if count>255 then count:=255;
end;
bPort:=1122;
iPort:=bPort;
for i:=1 to count do begin
if (WSAStartup(MAKEWORD(2,2), wsd)<>0) then begin
Writeln('Error starting WinSock');
halt(1);
end;
sClient:= socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient=SOCKET_ERROR) then begin
Writeln('Создание сокета невозможно:'+IntToStr(GetLastError));
halt(1);
end;
ss:=ParamStr(1);
sp:=PAnsiChar(ss);
server.sin_addr.s_addr:=inet_addr(sp);
server.sin_family:=PF_INET;
server.sin_port:=htons(1122);
if (connect(sClient,server,sizeof(server))=SOCKET_ERROR) then begin
Writeln('Немогу присоеднится ',WSAGetLastError);
end
else begin
for j:=1 to 128 do Data[j]:=i;
exit:=false;ok:=false;
ret:=send(sClient, Data,SizeOf(Data),0);
if (ret=SOCKET_ERROR) then begin
writeln('Ошибка отправки пакетов');
end;
exit:=false;ok:=false;
CreateThread(nil,0,@TimeT,nil,0,dwThreadId);
CreateThread(nil,0,@ClientThread,nil,0,dwThreadId);
while((time<5000)and(ok<>true)) do;
exit:=true;
if ok then begin
writeln('Ответ от '+ParamStr(1)+' пришол через '+IntToStr(time)+' миллисекунд');
inc(oc);
end
else begin
writeln('Истекло время ожидания');
inc(ec);
end;
time:=0;
end;
ep:=0;
if(ec<>0) then ep:=(count div ec)*100;
closesocket(sListen);
WSACleanup();
end;
writeln('Пакетов отправленно '+IntToStr(count)+', пришло ответов '+IntToStr(oc)+', пакетов потерянно '+IntToStr(ec)+'.'+#10+#13+'Процет потерь '+IntToStr(ep)+'%');
end.
3) Chat Server :
a) Uni1.cpp :
//--------------------------------------------------------------------------#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <winsock2.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <conio.h>
#pragma hdrstop
#include "tclientlist.h"
#if 1
#define pthread_mutex_t _RTL_CRITICAL_SECTION
#define pthread_mutex_lock EnterCriticalSection
#define pthread_mutex_unlock LeaveCriticalSection
#define pthread_t HANDLE
#define pthread_exit ExitThread
#define pthread_mutex_init InitializeCriticalSection
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.