Поделиться через


Тип данных сокета

В приложениях Winsock дескриптор сокета не является дескриптором файла и должен использоваться с функциями Winsock.

В UNIX дескриптор сокета представлен стандартным дескриптором файла. В результате дескриптор сокета в UNIX может быть передан в любую из стандартных функций ввода-вывода файлов (например, чтение и запись).

Кроме того, все дескрипторы в UNIX, включая дескриптор сокета, являются небольшими, неотрицательных целыми числами, и некоторые приложения делают предположение, что это будет верно.

Дескриптор сокетов Windows не имеет ограничений, кроме того, что значение INVALID_SOCKET не является допустимым сокетом. Дескриптор сокета может принимать любое значение в диапазоне от 0 до INVALID_SOCKET–1.

Так как тип SOCKET не подписан, компиляция существующего исходного кода из среды UNIX может привести к возникновению предупреждений компилятора о несоответствии типов данных со знаком или без знака.

Это означает, например, что проверка на наличие ошибок при возврате функций сокета и приема не должна выполняться путем сравнения возвращаемого значения с –1 или проверки, является ли значение отрицательным (как распространенные, так и юридические подходы в UNIX). Вместо этого приложение должно использовать константу манифеста INVALID_SOCKET, как определено в файле заголовка Winsock2.h . Пример:

Типичный стиль UNIX BSD

s = socket(...);
if (s == -1)    /* or s < 0 */
    {/*...*/}

Предпочитаемый стиль

s = socket(...);
if (s == INVALID_SOCKET)
    {/*...*/}

Перенос приложений сокетов в Winsock

Рекомендации по программированию Winsock