[Решено] Проблемма с клиентом

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[Решено] Проблемма с клиентом

Сообщение maks_m4a1 » 09.12.2011 00:50:01

Сервер:
Код: Выделить всё
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;
maks_m4a1
незнакомец
 
Сообщения: 2
Зарегистрирован: 08.12.2011 23:13:05

Re: Проблемма с клиентом

Сообщение vada » 09.12.2011 13:11:32

b у вас указатель. Ему не присвоено никакое значение. Текущее значение случайное (скорее всего nil), а вы пытаетесь присвоить не понятно какому участку памяти значение w[i].
Не взлетит!
Попробуйте так:
b := Addr(w[i]);
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Проблемма с клиентом

Сообщение maks_m4a1 » 09.12.2011 17:42:25

Да, действительно работает. Спасибо за подсказку - очень выручели, ибо уже 4 дня не могу дописать программулину и никто нигде не отвечает на мои темы.А на счет указателей... Не знаю я их, собсно как и ссылок, а это мне очень мешает.Просто не могу найти нигде доступную статью по тому, как их применять и где (
А за ответ - ОГРОМНОЕ СПАСИБО!)
maks_m4a1
незнакомец
 
Сообщения: 2
Зарегистрирован: 08.12.2011 23:13:05


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 243

Рейтинг@Mail.ru