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


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

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

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

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

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

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

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

Стандартный стиль BSD UNIX

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

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

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

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

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