ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 30.12.2009, 16:45
Аватар для ErrorNeo
ErrorNeo
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме:
4297091

Репутация: 2261


Отправить сообщение для ErrorNeo с помощью ICQ
По умолчанию

чорд
а когда я разбирался с вин-соком, фиг я эту статью нашел(
отличная статья для начинающих.

еще один +1 в пользу необходимости разделения раздела "наши статьи" на тематические подразделы

ps
открыл для себя набор интересного чтива под названием "все темы c slesh"

Последний раз редактировалось ErrorNeo; 30.12.2009 в 16:55..
 
Ответить с цитированием

  #22  
Старый 30.12.2009, 18:42
Аватар для =Zeus=
=Zeus=
Участник форума
Регистрация: 10.08.2009
Сообщений: 238
Провел на форуме:
724939

Репутация: 108
Отправить сообщение для =Zeus= с помощью ICQ
По умолчанию

Да, для новичков самое то. Сам с удовольствием прочитал, буду ждать 3-4 части.
 
Ответить с цитированием

  #23  
Старый 31.12.2009, 10:20
Аватар для Flenov
Flenov
Участник форума
Регистрация: 22.11.2008
Сообщений: 142
Провел на форуме:
636446

Репутация: 32
По умолчанию

Вот, я тут решил немного почудить в стиле PHP.

Короче вот код.
Пусть дети играются.
Код:
unit FSockets; {(c)Flenov forum.antichat}

interface

uses
  SysUtils, WinSock2;

type
  TFSocket = TSocket;


function FSocketsInicialize(Version: Word=$0202): Integer;
function FSockOpen(Host: String; Port: Word): TFSocket;
function FPuts(Sock: TFSocket; Str: String): Integer;
function FGets(Sock: TFSocket; var Size: Integer): String;
function FRedySend(Sock: TFSocket; Timeout: LongWord=10): Boolean;
function FRedyRead(Sock: TFSocket; Timeout: LongWord=10): Boolean;
function FClose(Sock: TFSocket): Integer;
function FSocketsDeinicialize: Integer;

implementation


function FSocketsInicialize(Version: Word=$0202): Integer;
var
  wData: TWSAData;
begin
  Result:=WSAStartup(Version, wData);
end;

function FSockOpen(Host: String; Port: Word): TFSocket;
var
  Sock: TFSocket;
  SockAddr: TSockAddrIn;
  HostEnt: PHostEnt;
  InAddr: TInAddr;
  FDSet: TFDSet;
begin
  Result:=0;
  HostEnt:=GetHostByName(PChar(Host));
  if (HostEnt=nil) then Exit;
  FillChar(InAddr, SizeOf(InAddr), 0);
  With InAddr, HostEnt^ do
                          begin
                            S_un_b.s_b1:=Byte(h_addr^[0]);
                            S_un_b.s_b2:=Byte(h_addr^[1]);
                            S_un_b.s_b3:=Byte(h_addr^[2]);
                            S_un_b.s_b4:=Byte(h_addr^[3]);
                          end;
  SockAddr.sin_family:=AF_INET;
  SockAddr.sin_addr:=InAddr;
  SockAddr.sin_port:=HToNS(Port);
  FillChar(SockAddr.sin_zero, SizeOf(SockAddr.sin_zero), 0);
  Sock:=Socket(AF_INET, SOCK_STREAM, 0);
  if (Sock<>INVALID_SOCKET) then
    if (Connect(Sock, @SockAddr, Sizeof(SockAddr))<>SOCKET_ERROR) then Result:=Sock
                                                                  else CloseSocket(Sock);
end;

function FPuts(Sock: TFSocket; Str: String): Integer;
begin
  Result:=Send(Sock, PChar(Str)^, Length(Str), 0);
end;

function FGets(Sock: TFSocket; var Size: Integer): String;
var
  Buff: PChar;
begin
  Buff:=GetMemory(Size);
  try
    Size:=Recv(Sock, Buff^, Size, 0);
    Result:=Copy(Buff, 1, Size);
  finally
    FreeMemory(Buff);
  end;
end;

function FRedySend(Sock: TFSocket; Timeout: LongWord=10): Boolean;
var
  WFDS: TFDSet;
  tv: TTimeVal;
begin
  Result:=False;
  tv.tv_sec:=Timeout;
  tv.tv_usec:=0;
  FD_ZERO(WFDS);
  FD_SET(Sock, WFDS);
  if FD_ISSET(Sock, WFDS) then
    if (Select(0, nil, @WFDS, nil, @tv)=1) then Result:=True;
end;

function FRedyRead(Sock: TFSocket; Timeout: LongWord=10): Boolean;
var
  RFDS: TFDSet;
  tv: TTimeVal;
begin
  Result:=False;
  tv.tv_sec:=Timeout;
  tv.tv_usec:=0;
  FD_ZERO(RFDS);
  FD_SET(Sock, RFDS);
  if FD_ISSET(Sock, RFDS) then
    if (Select(0, @RFDS, nil, nil, @tv)=1) then Result:=True;
end;

function FClose(Sock: TFSocket): Integer;
begin
  Result:=CloseSocket(Sock);
end;

function FSocketsDeinicialize: Integer;
begin
  Result:=WSACleanup;
end;
end.
 
Ответить с цитированием

  #24  
Старый 31.12.2009, 10:27
Аватар для Flenov
Flenov
Участник форума
Регистрация: 22.11.2008
Сообщений: 142
Провел на форуме:
636446

Репутация: 32
По умолчанию

Ссылки на пример использования:
Ссылка 1
Ссылка 2

Библиотека FSockets + WinSock2:
Ссылка 1
Ссылка 2
 
Ответить с цитированием

  #25  
Старый 31.12.2009, 19:22
Аватар для .Life
.Life
Banned
Регистрация: 26.12.2009
Сообщений: 152
Провел на форуме:
86338

Репутация: 0
По умолчанию

А вот ещё вопрос на засыпку:
Какие коды ошибок (кроме -1) могут вернуть Send и Recv?
 
Ответить с цитированием

  #26  
Старый 01.01.2010, 01:28
Аватар для Flenov
Flenov
Участник форума
Регистрация: 22.11.2008
Сообщений: 142
Провел на форуме:
636446

Репутация: 32
По умолчанию

Да наверно получается, что -1 единственный код ошибки
 
Ответить с цитированием

  #27  
Старый 22.02.2010, 02:01
Аватар для ntldr
ntldr
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме:
2364957

Репутация: 479
По умолчанию

На windows 7 существуют варианты использовать сырые сокеты? (без всяких winpcap)
 
Ответить с цитированием

  #28  
Старый 06.03.2010, 18:23
Аватар для #Specan
#Specan
Новичок
Регистрация: 16.02.2010
Сообщений: 14
Провел на форуме:
147116

Репутация: 1
По умолчанию

Уважаемый slesh, я вижу вы неплохой специалист в области сетевого программирования.
Если знаете, подскажите пожалуйста такой вопрос:

В PHP сокеты можно сравнить с файлами и там есть такая замечательная функция feof, которая возвращает true если все данные считаны и соответственно false если нет.
Есть ли аналог подобной функции в Delphi.

Теперь зачем мне это:
Дело в том, что я создаю небольшой TCP клиент, и я хочу не разрывать соединение.
Вот мне как раз и нужно знать получил ли я все данные или нет.
Если тупо использовать recv и ждать, когда она вернёт 0 - это не вариант.
Она просто тупо зависнет если я её вызову после приёма всех данных.
Вот мне и нужнол решение.
Подскажите, если знаете.
Заранее спасибо.
 
Ответить с цитированием

  #29  
Старый 06.03.2010, 19:59
Аватар для Chrome~
Chrome~
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме:
1747641

Репутация: 175
Отправить сообщение для Chrome~ с помощью ICQ
По умолчанию

Цитата:
Сообщение от #Specan  
Уважаемый slesh, я вижу вы неплохой специалист в области сетевого программирования.
Если знаете, подскажите пожалуйста такой вопрос:

В PHP сокеты можно сравнить с файлами и там есть такая замечательная функция feof, которая возвращает true если все данные считаны и соответственно false если нет.
Есть ли аналог подобной функции в Delphi.

Теперь зачем мне это:
Дело в том, что я создаю небольшой TCP клиент, и я хочу не разрывать соединение.
Вот мне как раз и нужно знать получил ли я все данные или нет.
Если тупо использовать recv и ждать, когда она вернёт 0 - это не вариант.
Она просто тупо зависнет если я её вызову после приёма всех данных.
Вот мне и нужнол решение.
Подскажите, если знаете.
Заранее спасибо.
#Specan, немного неправильно.
Цитата:
Если подключение, открытое при помощи fsockopen() не было закрыто сервером, feof() будет ждать достижения таймаута прежде чем вернуть TRUE. Время таймаута по умолчанию равно 60 секундам. Вы можете использовать stream_set_timeout() для того, чтобы изменить это значение.
То есть сервак должен закрыть соединение, что бы данная функция возвратила True.
Цитата:
Сообщение от #Specan  
Дело в том, что я создаю небольшой TCP клиент, и я хочу не разрывать соединение.
Лично я думаю, что вы должны использовать какие то особенности своего внутреннего протокола. Например, при получении определенных данных перестать читать из сокета.

Хотя я точно не уверен насчет всего этого, поэтому если что, пусть slesh ответит. Он укажет более правильный вариант.
 
Ответить с цитированием

  #30  
Старый 06.03.2010, 20:19
Аватар для #Specan
#Specan
Новичок
Регистрация: 16.02.2010
Сообщений: 14
Провел на форуме:
147116

Репутация: 1
По умолчанию

Спасибо за ответ!
Получается php feof можно сравнить с delphi sellect?
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Учимся юзать Мeterpreter (Или Metasploit Framework часть 4) -=lebed=- Авторские статьи 6 07.08.2007 13:27
Учимся юзать консоль MSF 3.0 beta 3 (или Metasploit Framework часть 3) -=lebed=- Авторские статьи 37 02.04.2007 17:40
SQL инъекция и Oracle, часть 2 k00p3r Чужие Статьи 0 13.06.2005 11:24
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ