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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка состояния при создании сокета. Здравствуйте! Кто как делает проверку со 
V
    Опции темы
tstr
  Дата 28.6.2009, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2009

Репутация: нет
Всего: нет



Здравствуйте!
Кто как делает проверку состояния при создании сокетов? Как лучше  smile ?

Код

/* Например, создаем сокет: */

    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);

/* ..а теперь проверяем состояние (вариант 1): */

    if (-1 == errno)
        fprintf(stderr, "*** Error: can't create socket\n"),
        exit(EXIT_FAILURE);

/* вариант 2: */

    if (-1 == sock)
        fprintf(stderr, "*** Error: can't create socket\n"),
        exit(EXIT_FAILURE);

/* вариант 3: */

    if (0 > errno)
        fprintf(stderr, "*** Error: can't create socket\n"),
        exit(EXIT_FAILURE);

/* вариант 4: */

    if (0 > sock)
        fprintf(stderr, "*** Error: can't create socket\n"),
        exit(EXIT_FAILURE);


Кто что думает по этому поводу? Спасибо  smile 
PM   Вверх
Andrew121
Дата 28.6.2009, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 21.6.2009

Репутация: нет
Всего: 1



4 вариант.
PM MAIL   Вверх
tstr
Дата 28.6.2009, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2009

Репутация: нет
Всего: нет



А почему именно 4?
Так надежней?

Хотел бы услышать обоснования выбора.
Я думаю так: ведь функция может вернуть и не -1, а другое отрицательное число, поэтому лучше писать (0 > x), а переменная errno может быть случайно перезаписана.

Это сообщение отредактировал(а) tstr - 28.6.2009, 05:48
PM   Вверх
Олег2005
Дата 28.6.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Цитата(tstr @  28.6.2009,  04:24 Найти цитируемый пост)
  sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);

Только не надо писать IPPROTO_IP в потоковом стиле взаимодействия
Или 0, или IPPROTO_TCP
PM MAIL WWW MSN   Вверх
Alca
Дата 29.6.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx
Цитата

socket Function

The socket function creates a socket that is bound to a specific transport service provider.
...
Return Value

If no error occurs, socket returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by calling WSAGetLastError.


Добавлено через 3 минуты и 43 секунды
вариант 2


--------------------
PM WWW ICQ Skype Jabber   Вверх
tstr
Дата 29.6.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2009

Репутация: нет
Всего: нет



Цитата

Только не надо писать IPPROTO_IP в потоковом стиле взаимодействия
Или 0, или IPPROTO_TCP 


Время познее было - очепятался.. smile

Цитата

... a specific error code can be retrieved by calling WSAGetLastError


Надо не виндовый сокет, поэтому WSAGetLastError не поможет.
Но вот что я заметил, заглянув в /usr/src/sys/sys/errno.h:
Цитата

...
#define ENFILE                        23            /* Too many open files in system */
#define EMFILE                        24            /* Too many open files */
...
#define ESOCKTNOSUPPORT    44            /* Socket type not supported */
#define EPFNOSUPPORT          46            /* Protocol family not supported */
#define EAFNOSUPPORT          47            /* Address family not supported by protocol family */
...


Получается, что переменная errno может быть установлена в значение, например, 23 и,
видимо лучшим для отлова ошибки при создании сокета будут варианты проверок 2 и 4,
а для поиска конкретной причины ошибки, сравнивать переменную errno с предопределенными
в /usr/src/sys/sys/errno.h константами с помощью какого-нить switch-case...

Что скажете?

Это сообщение отредактировал(а) tstr - 29.6.2009, 15:39
PM   Вверх
Alca
Дата 30.6.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Код

if (-1 == sock) {
        printf("Socket failure with error: %i", errno);
        exit(EXIT_FAILURE);
}



--------------------
PM WWW ICQ Skype Jabber   Вверх
Олег2005
Дата 30.6.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



В профессиональной программе надо проверять АБСОЛЮТНО все возможные ошибки!
В том числе и при создании сокета.
Проще сделать обертку для каждой сетевой функции - ну а внутри switch очень даже......
PM MAIL WWW MSN   Вверх
tstr
Дата 1.7.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2009

Репутация: нет
Всего: нет



Цитата

Проще сделать обертку для каждой сетевой функции - ну а внутри switch очень даже...... 


Так и буду делать. Спасибо  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0804 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.