OS X getsockopt: нет SO_PROTOCOL

OS X не предлагает SO_PROTOCOL опция сокета, которая позволяет вызывающей стороне "... получить тип сокета как целое число". ( http://linux.die.net/man/7/socket)

Другими словами, следующая программа собирается и работает под Linux, но не компилируется под OS X:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char **argv)
{
    int c, s, type, len;
    len = sizeof(type);

    s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s < 0)
    {  
        fprintf(stderr, "socket kaboom: %s\n", strerror(errno));
        return 1;
    }
    if (getsockopt(s, SOL_SOCKET, SO_PROTOCOL, &type, &len) < 0)
    {  
        fprintf(stderr, "getsosockopt kaboom: %s\n", strerror(errno));
        return 1;
    }
    printf("socket type: %d\n", type);
    return 0;
}

Как сделать это под OS X?

1 ответ

Стандарт SO_TYPE опция сокета, которая возвращает значения как SOCK_STREAM (соответствует ПТС) и SOCK_DGRAM (соответствует UDP), должно хватить. С SCTP, SOCK_STREAM может соответствовать TCP или SCTP и SO_PROTOCOL полезно их различать, но MacOS X не поддерживает SCTP.

Доменные сокеты Unix не используют номера протоколов; следовательно, SO_TYPE там тоже правильный выбор.

Другие вопросы по тегам