Возможно вы искали: 'Romancing the Seven Wo...'

May 31 2025 02:15:24
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96425698
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18407
• Обзор The Walking ... 18853
• Обзор DMC: Devil M... 19921
• Обзор на игру Valk... 15921
• Обзор на игру Stars! 17810
• Обзор на Far Cry 3 18000
• Обзор на Resident ... 16063
• Обзор на Chivalry:... 17561
• Обзор на игру Kerb... 18021
• Обзор игры 007: Fr... 16667
Превью о играх
• Превью к игре Comp... 18003
• Превью о игре Mage... 14502
• Превью Incredible ... 14763
• Превью Firefall 13523
• Превью Dead Space 3 16378
• Превью о игре SimC... 14772
• Превью к игре Fuse 15479
• Превью Red Orche... 15589
• Превью Gothic 3 16388
• Превью Black & W... 17402
Главная » Статьи » Разное » Эксперимент с неблокирующимися сокетами (block socket gcc example)

Эксперимент с неблокирующимися сокетами (block socket gcc example)

Ключевые слова: block, socket, gcc, example, (найти похожие документы)

Date: Wed, 05 Mar 2003 09:53:51 +0500
From: Valentin Nechayev <netch@segfault.kiev.ua>
Newsgroups: ftn.ru.unix.prog
Subject: Эксперимент с неблокирующимися сокетами


>> Я уже посоветовал. Про треды ничего сказано не было.
AP> Угу. А если у меня уже взведён другой обработчик алармов? аларм -- криво как
AP> ни крути.

Случай другого обработчика, кажется, рассмотрен в sendmail'е, там это
обходится через setitimer() сохранением старого состояния и восстановлением
по сигналу. В общем, методы есть.

>> А вообще, повтори plz ещё раз ситуацию. Ты хочешь, чтобы на сокете,
>> который или ещё не прошёл connect(), или уже не прошёл (refused, и тому
>> подобное), read() выдавал что-то осмысленное?
AP> Я хочу быть уверенным, что неблокирующийся сокет прошёл коннект. Вроде
AP> приведённый мной код должен делать именно это.

Если 1) сокет сделан неблокирующим, 2) сделан connect(), 3) дождались
возможности записи, и вот тут возникает проблема определить, получился
успешный коннект или нет? Проверка на неблокируемость чтения и записи
проходит на оба успешно, потому что они потом вылетят с ошибкой?
Я правильно описал, чего ты хочешь?

Вот отчёт теста (код - ниже):

netch@iv:~/prog/tests/sockets/connect>./c
scheck(RW): after poll: not ready for anything
now is 1046846925:031937
on connect: -1,36
c: getpeername: Socket is not connected
now is 1046846925:032188
Connect is in progress
scheck(RW): after poll: not ready for anything
sget: -1,Resource temporarily unavailable(35)
now is 1046846925:032241
scheck(RW): after poll: ready for write
sget: -1,Resource temporarily unavailable(35)
now is 1046846925:170563
peer: 0xC1C1C104:22
scheck(R): after poll: ready for read
sget: 40,Resource temporarily unavailable(35)
now is 1046846925:307460

Вот tcpdump к этому:

1046846925.032031 193.193.199.34.1046 > 193.193.193.4.22: S 1949113222:1949113222(0)
win 57344 <mss 1460> (DF)
1046846925.169908 193.193.193.4.22 > 193.193.199.34.1046: S 518759507:518759507(0)
ack 1949113223 win 57344 <mss 1460> (DF)
1046846925.169970 193.193.199.34.1046 > 193.193.193.4.22: . ack 1 win 58400 (DF)
1046846925.306852 193.193.193.4.22 > 193.193.199.34.1046: P 1:41(40) ack 1 win 58400
(DF)
1046846925.307544 193.193.199.34.1046 > 193.193.193.4.22: F 1:1(0) ack 41 win 58400
(DF)
1046846925.435266 193.193.193.4.22 > 193.193.199.34.1046: . ack 2 win 58400 (DF)
1046846925.444044 193.193.193.4.22 > 193.193.199.34.1046: F 41:41(0) ack 2 win 58400
(DF)
1046846925.444069 193.193.199.34.1046 > 193.193.193.4.22: . ack 42 win 58400 (DF)

Видно, что:
1. Прямым критерием того, что коннект есть, является положительный ответ
getpeername().
2. По connect() ушёл SYN, готовности нет ни к чему, а мы пошли в спячку.
getpeername() пока говорит, что ничего нет. Спячка заканчивается приходом
пакета SYN+ACK, после чего немедленно возникает готовность к записи.
3. Готовность к чтению возникает уже на четвёртом пакете - когда со стороны
сервера прошёл PSH+ACK с данными (в котором SSH'евый баннер; я уже не буду
включать показ данных - по отчёту видно, что прибежало 40 байт).

То есть, я бы советовал тебе после готовности к записи сделать getpeername()
и по её ответу понять, что же у нас такое.
Hепонятно, что ты говорил про то, что recv() возвращает 0. Странно это.

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <err.h>

void
scheck( int s, int timeo, const char* e )
{
struct pollfd pf;
int rc;
pf.fd = s;
pf.events = 0;
if( strchr( e, 'R' ) )
pf.events |= POLLRDNORM;
if( strchr( e, 'W' ) )
pf.events |= POLLWRNORM;
rc = poll( &pf, 1, timeo );
if( rc == -1 )
warn( "poll" );
if( pf.revents & POLLHUP )
printf( "after poll: hupn" );
else if( pf.revents & POLLRDNORM ) {
if( pf.revents & POLLWRNORM )
printf( "scheck(%s): after poll: ready for read and writen", e );
else
printf( "scheck(%s): after poll: ready for readn", e );
}
else {
if( pf.revents & POLLWRNORM )
printf( "scheck(%s): after poll: ready for writen", e );
else
printf( "scheck(%s): after poll: not ready for anythingn", e );
}
}

void
showpeer( int s )
{
struct sockaddr_in si;
socklen_t sil;
int r;
sil = sizeof si;
r = getpeername( s, ( struct sockaddr* ) &si, &sil );
if( r < 0 ) {
warn( "getpeername" );
return;
}
printf( "peer: 0x%08X:%dn", (unsigned) ntohl( si.sin_addr.s_addr ),
(int) ntohs( si.sin_port ) );
}

void ptime()
{
struct timeval tv;
gettimeofday( &tv, NULL );
printf( "now is %lu:%06lun", tv.tv_sec, tv.tv_usec );
}

void
sget( int s )
{
char buf[100];
int rc, se;
rc = read( s, buf, sizeof buf ); se = errno;
printf( "sget: %d,%s(%d)n", rc, strerror(se), se );
}

int
main()
{
int s, ff, rc, se;
struct sockaddr_in sia;
s = socket( AF_INET, SOCK_STREAM, 0 );
if( s == -1 ) err( 1, "socket()" );
ff = fcntl( s, F_GETFL, 0 );
if( ff == -1 ) err( 1, "F_GETFL" );
if( fcntl( s, F_SETFL, O_NONBLOCK | ff ) == -1 ) err( 1, "F_SETFL" );
memset( &sia, 0, sizeof sia );
sia.sin_family = AF_INET;
sia.sin_port = htons( 22 );
sia.sin_addr.s_addr = htonl( 0x7F000001 );
sia.sin_addr.s_addr = htonl( 0xC1C1C104 );
Connect:
scheck( s, 0, "RW" );
ptime();
rc = connect( s, ( struct sockaddr* ) & sia, sizeof sia ); se = errno;
printf( "on connect: %d,%dn", rc, se );
showpeer( s );
ptime();
if( rc == -1 && se == EINTR ) goto Connect;
if( rc == 0 ) {
printf( "connect: ok immediatelyn" );
scheck( s, 0, "RW" );
showpeer( s );
return 0;
}
if( rc == -1 && se != EINPROGRESS )
errc( 1, se, "connect" );
if( rc == -1 && se == EINPROGRESS ) {
printf( "Connect is in progressn" );
scheck( s, 0, "RW" );
sget( s );
ptime();
scheck( s, 10000, "RW" );
sget( s );
ptime();
showpeer( s );
scheck( s, 10000, "R" );
sget( s );
ptime();
}
return 0;
}


-netch-
1061 Прочтений •  [Эксперимент с неблокирующимися сокетами (block socket gcc example)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Эксперимент с неблокирующимися соке... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка