Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2012, 18:15   #11
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Код клиента:
Код:
var S:TSocket;
   Addr:TSockAddr;
   Data:TWSAData;
   j,Was_send:integer;
   buf: array [0..50] of char;
   Otpravka:String;
......
// Кнопка Connect

  WSAStartup($101,Data);
    S:=Socket(AF_Inet,Sock_Stream,0);
    Addr.sin_family:=AF_Inet;
    Addr.sin_port:=HToNS(25);
    Addr.sin_addr.S_addr:=Inet_Addr('127.0.0.1');
    FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
    Connect(S,Addr,SizeOf(TSockAddr))
....
// Кнопка Send

     otpravka:=TimeToStr(Now);
     for J:=1 to Length(otpravka) do
      buf[j]:=otpravka[j];
      Was_send:=send(S,buf,sizeof(buf),0);
      memo1.Lines.Add(IntToStr(was_send)+' bytes was sent');
.....
Код сервера (здесь все намного хуже!Мой недоиндусский код).
Код:
var
    Sockets:array of TSocket;
    Addr:TSockAddr;
    Data:TWSAData;
    I,J:Integer;
    FDSet:TFDSet;
    sizee:integer;
    buf: array of char;
    Timeout: TTimeVal;
    My_thread: TMyThread;
    my_lock:u_long=0;
    my_unlock:u_long=1;
    listen_socket:TSocket;
    vbuf : string;
    vsize : integer=50;
....
// Кнопка Listen

  WSAStartup($101,Data);
  listen_socket:=Socket(AF_Inet,Sock_Stream,0);
  setlength(sockets,i+1);
  sockets[i]:=0;

 ioctlsocket(listen_socket,fionbio,my_unlock);

  Addr.sin_family:=AF_Inet;
  Addr.sin_port:=HToNS(25);
  Addr.sin_addr.S_addr:=InAddr_Any;
  FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);

 If Bind(listen_socket,Addr,SizeOf(TSockAddr))<>0 then exit;

  Listen(listen_socket,SoMaxConn);

  setlength(buf,vsize);
  fd_zero(FDSet);
   FD_Set(Listen_socket,FDSet);
....
// Кнопка Receive
{в Form1.Create i присваиваем нуль, а TimeOut делаем равным 5 секундам }
 select(0,@FDSet,nil,nil,@TimeOut);
      if i=0 then
        begin
          sockets[i]:=Accept(Listen_socket,nil,nil);
          FD_set(sockets[i],FDSet);
          inc(i);
          setlength(sockets,i+1);
       end;

       sizee := recv(sockets[i-1],buf[0],vsize,0);
       form1.caption:=inttostr(sizee);
       setlength(vbuf,vsize);
       lstrcpyn(@vbuf[1],@buf[0],vsize);
       Form1.Memo1.Lines.Add(vbuf);
       setlength(buf,0);
       vBuf:='';
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 17.12.2012, 19:11   #12
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

поток который ты создаешь крутнется один раз и пшик... закончится
поток должен крутиться в цикле например
while not Terminated do
begin
...............
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 17.12.2012, 19:41   #13
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Попробовал сделать в цикле, все равно "пшик" после одной передачи и приема.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 17.12.2012, 19:50   #14
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

пример только читающего сервера по твоим мотивам
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,Windows,WinSock;

var
  Data:TWSAData;
  listen_socket:TSocket;
  Sockets:array of TSocket;
  Addr:TSockAddr;
  I,J:Integer;
  FDSet:TFDSet;
  buf: string;
  Timeout: TTimeVal;
begin
  WSAStartup($101,Data);
  listen_socket:=Socket(AF_INET,SOCK_STREAM,0);
  Addr.sin_family:=AF_INET;
  Addr.sin_port:=HToNS(25);
  Addr.sin_addr.S_addr:=InAddr_Any;
  If Bind(listen_socket,Addr,SizeOf(TSockAddr))=0 then exit;
  If Listen(listen_socket,SoMaxConn)=0 then exit;

  TimeOut.tv_sec:=60;

  while true do
  begin
    FD_ZERO(FDSet);
    FD_SET(Listen_socket,FDSet);
    for i:=Low(Sockets) to High(Sockets) do
      if Sockets[i]<>INVALID_SOCKET then
        FD_SET(Sockets[i],FDSet);

    if select(0,@FDSet,nil,nil,@TimeOut)=0 then Continue;

    if FD_ISSET(Listen_socket,FDSet) then
    begin
      i:=Low(Sockets);
      while i<=High(Sockets) do
        if Sockets[i]=INVALID_SOCKET then
          break;
      if i>High(Sockets) then
        SetLength(Sockets,i);
      j:=SizeOf(TSockAddr);
      Sockets[i]:=Accept(listen_socket,@Addr,@j);
    end;

    for i:=Low(Sockets) to High(Sockets) do
    begin
      if FD_ISSET(Sockets[i],FDSet) then
      begin
        SetLength(buf,4096);
        SetLength(buf,recv(Sockets[i],buf[1],Length(buf),0));
        if length(buf)= 0 then
        begin
          CloseHandle(Sockets[i]);
          Sockets[i]:=INVALID_SOCKET;
        end else
          writeln(buf);
      end;
    end;
  end;
end.
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 17.12.2012, 20:21   #15
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
все равно "пшик"
Предлагаешь попрыгать с бубном и догадаться почему "пшик" ?
xoodoo вне форума Ответить с цитированием
Старый 17.12.2012, 20:34   #16
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Спасибо большое, там только надо исправить
Код:
  If Bind(listen_socket,Addr,SizeOf(TSockAddr))<>0 then exit;
  If Listen(listen_socket,SoMaxConn)<>0 then exit;
...........
   if i>High(Sockets) then
        SetLength(Sockets,i+1);
      j:=SizeOf(TSockAddr);
И все работает!
Подскажите, что делать, чтобы несколько клиентов могли подключиться, ибо когда несколько приложений-клиентов запускаю и конектчусь, то сервер больше не принимает сообщения.
Update
А если добавить инкремент сюда,
Код:
      while i<=High(Sockets) do
      begin
        if Sockets[i]=INVALID_SOCKET then
          break;

      end;
то и подключения нескольких клиентов тоже работают.
Сдается мне, что ошибки тут не с проста. ))))
Ещё раз спасибо за разбор полетов.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 18.12.2012 в 04:08.
Rin вне форума Ответить с цитированием
Старый 17.12.2012, 20:38   #17
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
И все работает!
Ну и где "цикл" ?
xoodoo вне форума Ответить с цитированием
Старый 17.12.2012, 20:44   #18
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Скопировал код у Slym. Цикл там. Осталось сделать подключение нескольких клиентов. Чем сейчас и займусь.
Только не надо говорить, что так и получаются быдло-кодеры, которые тупо копируют и т.д. и т.п. Сижу, разбираю код сейчас, подглядывая в статью "Использование сокетов в Delphi".
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 17.12.2012 в 20:47.
Rin вне форума Ответить с цитированием
Старый 17.12.2012, 20:49   #19
xoodoo
Форумчанин
 
Регистрация: 11.04.2012
Сообщений: 212
По умолчанию

Цитата:
Скопировал код у Slym
а свой мозг на что ?
код Slym'ом дан для анализа, а не для слепого копирования.
xoodoo вне форума Ответить с цитированием
Старый 17.12.2012, 21:15   #20
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
а свой мозг на что ?
Цитата:
Сижу, разбираю код сейчас, подглядывая в статью "Использование сокетов в Delphi".
вапппппппвапвпвып
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Telnet клиент на сокетах an1s1 Общие вопросы .NET 1 19.07.2012 17:38
Статья: Низкоуровневое сетевое программирование. Пишем клиент/серверное приложение на сокетах Беркли oleg kutkov C/C++ Сетевое программирование 42 22.01.2011 00:35
Чат на сокетах yandzee Общие вопросы C/C++ 6 11.12.2010 14:50
Простейшие клиент-сервер на сокетах: почему ошибка 10060 kolchakA Общие вопросы C/C++ 7 01.12.2009 08:14