LACP实现,什么是正确的套接字使用?

时间:2012-02-15 20:06:39

标签: c linux sockets

我是新手使用套接字。

我必须在linux环境下,在用户空间中实现LACP协议。每台计算机定期为每个以太网接口发送一个控制消息,一个结构LACPDU。 什么是最好的套接字系列来让他们进行通信(RAW,PACKET,TCP,UDP)?套接字发送/接收必须是同一类型的?

我的应用程序已经很好地发送了LACPDU,但是另一方的应用程序没有收到它们(我使用wireshark捕获它,它捕获数据包,但是没有到达应用程序)。

这是我创建套接字的方式:

发送paquet :(即使没有绑定,这也可以正常工作)

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 :(得分:0)

我不太确定,但我认为你需要绑定到接收器中的那个套接字才能恢复。它对发送方工作得很好,因为你只是发送,但接收方不知道从哪里抓取它。所以使用bind并查看是否有效。

披露:我不熟悉LACP协议。

答案 1 :(得分:0)

LACP是第2层(数据链路层)协议。您的代码正在尝试将LACP帧作为UDP数据包发送,这不会产生任何影响。

您的代码特别无效,因为您没有在发送代码中完全填写struct sockaddr,并且没有在接收代码中绑定套接字。但是,这种方法对于实际的LACP数据包根本不起作用;你可能需要使用原始套接字。

答案 2 :(得分:0)

由于您需要发送第2层数据包,因此数据包套接字是正确的选择。请注意,您使用的AF_INET/SOCK_PACKET - 组合很久以前就已被弃用。使用AF_PACKET作为套接字域,并使用SOCK_RAWSOCK_DGRAM作为类型。使用sendto / recvfrom - 来电是正确的方法,但您的初始化大多是错误的。

我建议你看看使用数据包套接字的现有代码(如this),看看它是如何完成的。我还建议您查看联系人packet(7)(请参阅here)。