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
там тоже правильный выбор.