- Код: Выделить всё
Uses Crt,Sockets;
Type
Inet=object
Public
function Create() :boolean;
function GetData() :boolean;
function Close() :boolean;
Private
Saddr :TInetSockAddr;
Sock,Sock_new :longint;
buf :^byte;
SAddrLength :LongWord;
temp :text;
end;
Var
Serv:inet;
function Inet.Create() :boolean;
begin
New(buf);
buf^:=0;
assign(temp,'REZULT.txt');
rewrite(temp);
Sock:=fpsocket(AF_INET,SOCK_STREAM,0);
If (Sock = -1) then
Writeln('Socket Error')
else
Writeln ('Socket created - OK');
SAddr.sin_family:=AF_INET;
SAddr.sin_Port:=htons(50000);
SAddr.sin_addr:=StrToNetAddr('127.0.0.1');
SAddrLength:=SizeOf(SAddr);
If (fpbind(Sock,@SAddr,SizeOf(SAddr)) = -1) then
Writeln('Bind Error ',SocketError,' press Enter')
else
Writeln('Bind - OK!');
If (fplisten(Sock,1) = -1) then
Writeln('Listen Error, press Enter')
else
writeln ('Listen - OK');
Sock_new:=fpaccept(Sock,@SAddr,@SAddrLength);
If (Sock_new >= 0) then
writeln ('New socket - OK')
else
writeln('Accept - FALSE');
end;
function Inet.GetData() :boolean;
var
i:integer;
begin
for i:=1 to 40 do begin
If (fprecv(Sock_new,buf,SizeOf(string),0)>=0) then
writeln(temp,buf^);
end;
end;
function Inet.Close() :boolean;
begin
If (CloseSocket(Sock) = 0) then
WriteLn('Socket closed');
close(temp);
end;
Begin
ClrScr;
Serv.Create;
Serv.GetData;
Serv.Close;
writeln('Press any key for close this program');
End.
Клиент:
- Код: Выделить всё
Uses Crt,Sockets, sysutils;
Type
Inet=object
Public
function Create(ip:string):boolean;
function Send(t:string) :boolean;
function Close() :boolean;
Private
Saddr:TInetSockAddr;
Sock :longint;
end;
var
I:Inet;
function Inet.Create(ip:string):boolean;
begin
Sock:=fpsocket(AF_INET,SOCK_STREAM,0);
If (Sock = -1) then
Writeln('Socket Error')
else
writeln ('Socket created - OK');
SAddr.sin_family:=AF_INET;
SAddr.sin_Port:=htons(50000);
SAddr.sin_addr:=StrToNetAddr(ip);
If (fpconnect(Sock,@SAddr,SizeOf(SAddr)) <> -1) then
WriteLn('Connect - OK');
end;
function Inet.Close() :boolean;
begin
If (CloseSocket(Sock) = 0) then
WriteLn('Socket closed, press some button.');
end;
function Inet.Send(t:string) :boolean;
var
f:file of byte;
w:array[1..50000] of byte;
b:^byte;
c:byte;
i:longint;
begin
if FileExists(t) then
begin
writeln('File exists');
writeln(t);
assignFile(f,t);
reset(f);
while filesize(f) > i do
begin
i:=i+1;
read(f,w[i]);
writeln('w[',i,']=',w[i]);
b^:=w[i];
fpsend(Sock,b,SizeOf(string),0);
end;
writeln('Copy seccesfull! Please press some button');
closefile();
end
else
writeln('File not exists');
end;
Begin
ClrScr;
I.Create('127.0.0.1');
I.Send('testinput.txt');
I.Close;
readkey;
End.
Проблема состоит в том, что Лазарус ругается на это строку (клиент-сайд):
- Код: Выделить всё
b^:=w[i];
И сервер-сайд:
- Код: Выделить всё
If (CloseSocket(Sock) = 0) then
Как это исправить? И ещё... Очень подозрительно то, что компилятор говорит, что неверное количество входящих парметров функции close(), когда я пытаюсь закрыть файл. Глубоко сомневаюсь, что так и должно быть.
Сама ошибка, что появляется как на сервере так и клиенте: Project .... raised exception class 'Enternal: SIGSEGV'
Добавлено спустя 2 часа 6 минут 53 секунды:
С сервером разобрался. Использовал открытие файлов как через модуль sysutils так и system. В итоге на сервере нужно заменить:
- Код: Выделить всё
Uses Crt,Sockets;
--------------------------
function Inet.Create() :boolean;
begin
New(buf);
buf^:=0;
assign(temp,'REZULT.txt');
rewrite(temp);
Sock:=fpsocket(AF_INET,SOCK_STREAM,0);
If (Sock = -1) then
Writeln('Socket Error')
else
Writeln ('Socket created - OK');
SAddr.sin_family:=AF_INET;
SAddr.sin_Port:=htons(50000);
SAddr.sin_addr:=StrToNetAddr('127.0.0.1');
SAddrLength:=SizeOf(SAddr);
If (fpbind(Sock,@SAddr,SizeOf(SAddr)) = -1) then
Writeln('Bind Error ',SocketError,' press Enter')
else
Writeln('Bind - OK!');
If (fplisten(Sock,1) = -1) then
Writeln('Listen Error, press Enter')
else
writeln ('Listen - OK');
Sock_new:=fpaccept(Sock,@SAddr,@SAddrLength);
If (Sock_new >= 0) then
writeln ('New socket - OK')
else
writeln('Accept - FALSE');
end;
-----------------------------------------
function Inet.Close() :boolean;
begin
If (CloseSocket(Sock) = 0) then
WriteLn('Socket closed');
close();
end;
на
- Код: Выделить всё
Uses Crt,Sockets,sysutils;
-------------------------------
function Inet.Create() :boolean;
begin
New(buf);
buf^:=0;
assignfile(temp,'REZULT.txt');
rewrite(temp);
Sock:=fpsocket(AF_INET,SOCK_STREAM,0);
If (Sock = -1) then
Writeln('Socket Error')
else
Writeln ('Socket created - OK');
SAddr.sin_family:=AF_INET;
SAddr.sin_Port:=htons(50000);
SAddr.sin_addr:=StrToNetAddr('127.0.0.1');
SAddrLength:=SizeOf(SAddr);
If (fpbind(Sock,@SAddr,SizeOf(SAddr)) = -1) then
Writeln('Bind Error ',SocketError,' press Enter')
else
Writeln('Bind - OK!');
If (fplisten(Sock,1) = -1) then
Writeln('Listen Error, press Enter')
else
writeln ('Listen - OK');
Sock_new:=fpaccept(Sock,@SAddr,@SAddrLength);
If (Sock_new >= 0) then
writeln ('New socket - OK')
else
writeln('Accept - FALSE');
end;
--------------------------------------------
function Inet.Close() :boolean;
begin
If (CloseSocket(Sock) = 0) then
WriteLn('Socket closed');
closefile(temp);
end;
А на клиенте:
- Код: Выделить всё
Inet=object
Public
function Create(ip:string):boolean;
function Send(t:string) :boolean;
function Close() :boolean;
Private
Saddr:TInetSockAddr;
Sock :longint;
end;
-------------------------------------------
function Inet.Send(t:string) :boolean;
var
w:array[1..50000] of byte;
b:^byte;
c:byte;
i:longint;
begin
if FileExists(t) then
begin
writeln('File exists');
writeln(t);
assign(f,t);
reset(f);
while filesize(f) > i do
begin
i:=i+1;
read(f,w[i]);
writeln('w[',i,']=',w[i]);
b^:=w[i];
fpsend(Sock,b,SizeOf(string),0);
end;
writeln('Copy seccesfull! Please press some button');
close(f);
end
else
writeln('File not exists');
end;
на
- Код: Выделить всё
Inet=object
Public
function Create(ip:string):boolean;
function Send(t:string) :boolean;
function Close() :boolean;
Private
Saddr:TInetSockAddr;
Sock :longint;
f:file of byte;
end;
--------------------------------------
function Inet.Send(t:string) :boolean;
var
w:array[1..50000] of byte;
b:^byte;
c:byte;
i:longint;
begin
if FileExists(t) then
begin
writeln('File exists');
writeln(t);
assignFile(f,t);
reset(f);
while filesize(f) > i do
begin
i:=i+1;
read(f,w[i]);
writeln('w[',i,']=',w[i]);
b^:=w[i];
fpsend(Sock,b,SizeOf(string),0);
end;
writeln('Copy seccesfull! Please press some button');
closefile(f);
end
else
writeln('File not exists');
end;