Echo Сервер. Программа для отправки файлов

Страницы работы

Содержание работы

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

Похожие материалы

Информация о работе

Тип:
Написанные программы на языках программирования
Размер файла:
2 Mb
Скачали:
0