HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ИНФО > Статьи > Авторские статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Неблокируемые сокеты
  #1  
Старый 12.06.2009, 10:32
Shaitan-Devil
Участник форума
Регистрация: 15.08.2008
Сообщений: 167
С нами: 9336002

Репутация: 204
По умолчанию Неблокируемые сокеты

[INTRO]
Здравствуйте, юные хакиры. Сегодня я расскажу вам о неблокируемых(асинхронных) сокетах.
Сокеты поддерживают два режима: блокируемые(синхронные) и неблокируемые(асинхронные) . В чем же их основное отличие? Функции(send,recv и.т.д.) после объявления, ожидают окончания операции, а в неблокируемом режиме
если данные не приходят сразу, завершают свою работу. Одной из достойных замен неблокирующему режиму являются потоки.
[Создаем неблокируемый сокет]
Точнее переводим его в асинхронный режим
Код:
SCOKET s;
u_long c=1;
u_long i;
nRet = ioctlsocket(s, FIONBIO, (u_long *) &c);
Если сервер не послал нам ответ сразу, функции будут возвращать WSAEWOULDBLOCK. В принципе, моэно выполнять команду до получения результата. Т.е.
Код:
while ( !connect( s, (struct sockaddr *)&sa, sizeof(sa) ) != WSAEWOULDBLOCK )
{
connect(s,(struct sockaddr*)&sa,
                sizeof(sa));
}
Но это приводит нас обратно к блокируемым сокетам. У нас другая цель. Поэтому, если нам нужно через определенное время посылать пинги или проверять есть ли данные в буфере, мы можем использовать ввод-вывод в WinSock.
[SELECT]
Это можно реализовать с помощью функции select(). Сама функция:
Код:
int select(
fd_set FAR * readfds,/*Возможность чтения*/
fd_set FAR * writefds,/*Возможность записи*/
fd_set FAR * exceptfds,/*Срочне данные*/
const struct timeval FAR * timeout/*Отсчет времени*/
);
Для работы с fd_set опеределены макросы
Код:
FD_ISSET(s, *set)/*Проверяет входит ли сокет в набор*/
FD_SET(s, *set)/*Добавляет сокет в набор*/
FD_CRL(s,*set)/*Удаляет сокет s из наборы*/
Итак, для примера напишем приложение проверяющее сокет на возможность записи
Код:
    WSADATA WSAData;
    if (WSAStartup(0x0202, &WSAData))                                    
    return 0;
    SOCKET s;
    sockaddr_in sa;
    sa.sin_family=AF_INET;
    sa.sin_port=htons(12345);
sa.sin_adrr.s_addr=inet_addr("127.0.0.1")
s=(AF_INET,SOCK_STREAM,0);
fd_set f;
int r;
char buff;
 connect(s,(struct sockaddr *)&sa, sizeof(sa));
if(r=select(0,NULL,&f,NULL,NULL))=SOCKET_ERROR)
{
cout<<"Error";
}
if(FD_ISSET(s, &f))
{
send(s, buff, sizeof(buff),0);
}else{ cout<<"Error";}
[Неблокирующий connect]
В любом случае connect() остается неблокирющим. Но его можно перевести в неблокирющий режим функцией fcntl()
Код:
int flags = fcntl(s, F_GETFL, 0);
if(fcntl(s, F_SETFL, flags | O_NONBLOCK) ==SCOKET_ERROR)
{
cout<"Error";
}
if(connect(s, (struct sockaddr*)&sa, sizeof(sa)) !=SOCKET_ERROR)
  {


    if(errno == EINPROGRESS)
      {
        /*ту мы с помощью select() проверяем сокет на готовность*/
      }
    else
      {
cout<<"Error";
      }
  }
else
  {
      /*
       * Соединение было установлено за время
       * системного вызова, работа продолжается
       * традиционным способом.
       */ 

  }
П.С. Есть еще несколько способов использования асинхронных сокетов, к примеру WSAAsyncSelect().
П.П.С Прошу строго не судить и высказывать свои замечания.
 

  #2  
Старый 12.06.2009, 13:17
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
С нами: 10216668

Репутация: 930


По умолчанию

Цитата:
дельфи? да нуууу
Не позорился бы.

Shaitan-Devil, мало материала, никаких тонкостей, таких статей очень много в нете. Развивай и расширяй статью = )
+

Added: Здесь будет в самый раз

Последний раз редактировалось Fata1ex; 12.06.2009 в 13:23..
 

  #3  
Старый 12.06.2009, 13:22
Shaitan-Devil
Участник форума
Регистрация: 15.08.2008
Сообщений: 167
С нами: 9336002

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

Цитата:
Сообщение от Fata1ex  
Shaitan-Devil, мало материала, никаких тонкостей, таких статей очень много в нете. Развивай и расширяй статью = )
+
ХЗ. В рунете более-менее внятного объяснения я так и не нашел.
 

  #4  
Старый 12.06.2009, 18:13
diehard
Постоянный
Регистрация: 30.09.2007
Сообщений: 815
С нами: 9796693

Репутация: 659


По умолчанию

Не понял - а при чем тут Делфи?
 

  #5  
Старый 12.06.2009, 18:20
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
С нами: 10216668

Репутация: 930


По умолчанию

Пришел товарищ DVD-RW и заявил, что статья гавно, потому что про delphi
 

  #6  
Старый 12.06.2009, 22:39
--StraNger--
Познающий
Регистрация: 04.01.2009
Сообщений: 94
С нами: 9131159

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

про НЕБЛОКИРУЕМЫЕ сокеты в сети действительно информации немного
а статья нормальная как основа пойдет =)
 

  #7  
Старый 13.06.2009, 00:30
m0Hze
Он хакер.
Регистрация: 01.11.2008
Сообщений: 1,756
С нами: 9223466

Репутация: 3171


По умолчанию

Дельфи? оО я чтото пропустил в развитии Яп
*Пошел учить Delphi++
 

  #8  
Старый 12.06.2009, 15:07
LEE_ROY
Постоянный
Регистрация: 09.11.2006
Сообщений: 639
С нами: 10265091

Репутация: 541


По умолчанию

Цитата:
Сообщение от DVD_RW  
дельфи? да нуууу
имбицыл.
 
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему через сокеты я получаю куки, а через curl нет? Дикс PHP 6 25.05.2009 11:17
Delphi сокеты Flame of Soul С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 2 22.04.2009 04:56
Отправляем хтмл-письмо через сокеты je0n Статьи 4 07.02.2007 15:23
[Delphi] Закачка файлов через сокеты Navern С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 3 04.02.2007 16:13
В общем делаю запрос в сокеты! и Не чего не возвращает! AIN С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 19 07.08.2005 17:27



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


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




ANTICHAT ™ © 2001- Antichat Kft.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...
×

ESCROW ADMIN PANEL

Загрузка...
Загрузка...