Реализация LACP, какой правильный сокет использовать? - PullRequest
0 голосов
/ 16 февраля 2012

Я новичок в использовании сокетов.

Я должен реализовать в среде Linux, в пространстве пользователя, протокол LACP.Каждый компьютер периодически отправляет для каждого интерфейса Ethernet управляющее сообщение, LACPDU структуры.Какое семейство сокетов будет лучшим для общения (RAW, PACKET, TCP, UDP)?Разъем отправки / получения должен быть того же типа?

Мое приложение уже хорошо отправляет LACPDU, но приложение на другой стороне не получает их (я захватывал с помощью wireshark, он захватывает пакеты, ноне доходят до приложения).

Вот как я создал сокеты:

Отправить пакет: (это работает нормально, даже без привязки)

int sock, sent;
struct sockaddr sa;
if (sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_SLOW))<0)   //sockfd = socket(int socket_family, int socket_type, int protocol);        
        {perror("error socketsalida\n");
        exit(EXIT_FAILURE);}
sa.sa_family = AF_INET;
strcpy(sa.sa_data, iface);
if((sent = sendto(sock, data, len, 0, &sa, sizeof(sa))) <= 0)
               {perror("error sendto\n");
        exit(EXIT_FAILURE);}
close(sock);

Получение пакета: (это не работает)

int received, sockrec;
struct sockaddr sa;
struct LACPDU buffer;

socklen_t addrlen = sizeof (sa);
sockrec = socket(AF_INET, SOCK_PACKET, htons(ETH_P_SLOW));
if (sockrec<0) {perror("Error receiver socket\n");exit(EXIT_FAILURE);}
if ((received = recvfrom(sockrec, &buffer, BUFLEN, 0, (struct sockaddr *)&sa, &addrlen)) < 0)
        {perror("Errorrecvfrom\n");exit(EXIT_FAILURE);}

close (sockrec);

Любая идея?Спасибо.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2012

LACP - это протокол уровня 2 (канального уровня). Ваш код пытается отправить кадры LACP в виде пакетов UDP, что не окажет никакого влияния.

Ваш код специально не работает, потому что вы не полностью заполняете свой struct sockaddr в отправляющем коде и не привязываете сокет в принимающем коде. Однако этот подход вообще не будет работать для реальных пакетов LACP; вам, вероятно, понадобится использовать необработанные сокеты.

0 голосов
/ 16 февраля 2012

Поскольку вам необходимо отправлять пакеты уровня 2, сокеты пакетов являются правильным выбором. Помните, что используемая вами комбинация AF_INET/SOCK_PACKET давно устарела. Используйте AF_PACKET в качестве домена сокета и либо SOCK_RAW, либо SOCK_DGRAM в качестве типа. Использование sendto / recvfrom -calls - правильный путь для этого, но ваша инициализация в основном неверна.

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

0 голосов
/ 16 февраля 2012

Я не совсем уверен, но я думаю, что вам нужно привязать этот сокет в приемнике, прежде чем вы сможете получить recvfrom. Он отлично работает на отправителе, потому что вы просто отправляете, но получатель не знает, откуда его получить. Так что используйте привязку и посмотрите, работает ли это.

Раскрытие информации: я не знаком с протоколом LACP.

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