2012-02-15 65 views
0

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

我必须在Linux环境下实现,在用户空间,的LACP协议。每台计算机定期为每个以太网接口发送一个控制消息,一个结构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); 

任何ideea?谢谢。

回答

0

既然你需要发送第2个数据包,数据包套接字是正确的选择。请注意,您使用的AF_INET/SOCK_PACKET组合很久以前就已被弃用。使用AF_PACKET作为套接字域,并使用SOCK_RAWSOCK_DGRAM作为类型。使用sendto/recvfrom -calls是解决这个问题的正确方法,但您的初始化大多是错误的。

我建议你看看现有的代码(如this),它使用数据包套接字来查看它是如何完成的。我也推荐看一下手册页packet(7)(见here)。

+0

好的,非常感谢,我会尝试这种方式,然后我会发布结果。 – 2012-02-16 18:28:51

0

我真的不知道,但我认为你需要绑定到插座中的接收器,然后才能recvfrom的。它对发送者来说工作得很好,因为你只是发送消息,但接收者不知道从哪里接收消息。所以使用绑定,看看是否有效。

披露:我不熟悉的LACP协议型。

0

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

你的代码是专门不工作,因为你没有得到充分填写在发送代码的struct sockaddr,也没有约束力在接收代码插槽。但是,这种方法根本不适用于实际的LACP数据包;您可能需要使用原始套接字。

相关问题