отправлять сетевой трафик с определенного ip и порта без использования recvfrom или accept - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в сокетах и ​​сетевом программировании, поэтому, если вопрос кажется глупым, это потому, что я не полностью понимаю вышеупомянутые темы.

Необходимость непрерывной отправки данных телеметрии по сети.Не волнует, кто его получит, просто нужно отправить.Все, что нужно сделать клиенту, это просто подключиться к определенному IP-адресу и получить данные от определенного порта, и данные будут получены им.

Мой код записан в C.

* 1007.* Первоначально я думал, что это будет сокет UDP.Но у него есть метод recvfrom, т.е. мне (серверу) нужно подождать, пока кто-нибудь не подключится к нему.Тогда я решил взглянуть на сокет TCP / IP, но у него есть метод accept.

Я довольно долго искал онлайн, но не нашел ни одного кода, который мог бы мне помочь (возможно, я искалв неправильном месте).

Кто-нибудь знает, возможно ли то, о чем я говорю?Если так, как бы я это сделал?Если нет, то есть ли другие способы сделать это, например, не используя sockets?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Необходимость непрерывной отправки данных телеметрии по сети.Не очень важно, кто его получит, просто нужно отправить его.

Ну, ваш отправитель должен знать, ГДЕ отправлять данные.

Как правило,Получатель сначала отправит запрос вашему отправителю, чтобы он знал, что получатель существует, а затем ваш отправитель будет знать, куда отправлять пакеты.Но для этого требуется, чтобы ваш отправитель отслеживал все получатели, чтобы он мог отправлять отдельный пакет данных каждому получателю индивидуально.Для этого можно использовать UDP или TCP.

Если вы не хотите делать это таким образом, у вас есть 2 других варианта:

  • подсетьшироковещательная рассылка (работает только с IPv4) - ваш отправитель может создать сокет UDP, затем использовать setsockopt() для включения опции SO_BROADCAST и затем sendto() пакеты данных на широковещательный IP-адрес данной подсети.(или используйте send(), если он connect() заранее для широковещательного IP).Каждый отправленный пакет будет автоматически доставлен на каждую машину, которая подключена к той же подсети (независимо от того, хотят ли машины пакеты или нет).

    Ваш получатель может затем создать и bind() aUDP-сокет к интерфейсу локальной сети, который подключен к той же подсети, а затем используйте recvfrom() для чтения пакетов (или используйте recv(), если оно connect() заранее для IP-адреса отправителя).

  • многоадресная рассылка (работает как с IPv4, так и с IPv6) - ваш отправитель может создать сокет UDP и затем sendto() пакеты данных на IP-адрес данной группы многоадресной рассылки (или использоватьsend(), если это connect() для группы многоадресной рассылки IP заранее).Каждый пакет будет доставлен только получателям, которые присоединились к той же группе.

    Ваш получатель может создать и bind() сокет UDP к локальному сетевому интерфейсу, который имеет сетевой маршрут котправителя, затем используйте setsockopt() для присоединения сокета к группе многоадресной рассылки (используя IP_ADD_MEMBERSHIP для IPv4 и IPV6_ADD_MEMBERSHIP для IPv6), а затем используйте recvfrom() для чтения пакетов (или используйте recv(), если оно connect() к IP-адресу отправителя заранее).

Все, что нужно сделать клиенту, это просто подключиться к определенному IP-адресу и получить данные с определенного порта и данныебудет получено им.

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

0 голосов
/ 07 июня 2018

Необходимость непрерывной отправки данных телеметрии по сети.Не очень важно, кто его получит, просто нужно отправить его.

Так что используйте UDP.

Все, что нужно сделать клиенту, это простоподключитесь к определенному IP-адресу и получите данные от определенного порта, и данные будут получены им.

Поэтому используйте UDP.Просто звоните sendto() всякий раз, когда это необходимо.

Первоначально я думал, что это будет сокет UDP.

Вы были правы.

Ноу него есть recvfrom() метод

Правильно.

т.е. мне (серверу) нужно дождаться, пока кто-то подключится к нему.

Неправильно,recvfrom() ждет, пока кто-нибудь отправит ему , и отправителю совсем не нужно ждать.

Затем я решил посмотреть на сокет TCP / IP, но этотимеет метод accept().

Правильно.Вы должны сделать своего отправителя сервером, использовать listen(), accept(), send() и т. Д. Я не рекомендую это для вашей заявленной необходимости.

Если вы хотите иметь несколько прослушивателей, используйте UDP multicast.

...