2017-02-06 3 views
0

Независимо от того, используете ли вы winsock или posix, какую функцию вы используете для создания сетевого сокета, вам необходимо указать семейство адресов, протокол и «тип» сокета. Однако, похоже, этот параметр имеет очень мало значения для программиста, и его также можно определить, посмотрев на другие два параметра. Так в чем дело? Есть ли какая-то историческая причина? Как викинга использовали этот параметр, чтобы заманить английский из своих замков?Что такое тип сокета?

+0

Существует много типов «сокетов», а не только сокетов TCP или UDP. Некоторые из них используют третий аргумент для вызова сокета. –

+0

@Someprogrammerdude Не могли бы вы привести пример различных протоколов, используемых с несколькими типами носков, и указать на разницу? – Pyjong

ответ

3

Для udplite протокола, например, сокет создается следующим образом:

sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE); 

SCTP розетки:

sctp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP); 
sctp_socket = socket(PF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); 

Другими словами, третий аргумент socket вызовов не всегда выведенный из первых двух.

+0

O-kay .. Существуют ли другие значения типа, которые вы могли бы использовать в этом примере? – Pyjong

+0

@Pyjong Добавил больше примеров для вас. –

+0

Спасибо, хороший пример. Мне нужно было это увидеть. – Pyjong

1

я склонен согласиться с вами, что type аргумента в основном избыточный (хотя я не просматривал full list of internet protocols, я могу отсутствовать некоторые частные случаи) для одного важного случая, за исключением: сырые сокеты (SOCK_RAW). У них на самом деле нет протокола, связанного с ними, поэтому было бы бессмысленно размещать эту информацию в аргументе .

+0

Спасибо, SOCK_RAW определенно стоит изучить. Но я думаю, вы можете забыть о списке протоколов. Доступно только несколько избранных. Здесь есть интересный параграф http://man7.org/linux/man-pages/man2/socket.2.html ctrl + f «Протокол указывает« если вам интересно, конечно. – Pyjong

+0

Хорошо, что получилось неправильно. Я должен был сказать: «лишь немногие могут использоваться в качестве параметра для этой конкретной функции». Спасибо, что ты меня на правильном пути. – Pyjong