C 拉丁美洲和加勒比海合作伙伴关系的实施,什么';什么是正确的插座?

C 拉丁美洲和加勒比海合作伙伴关系的实施,什么';什么是正确的插座?,c,linux,sockets,C,Linux,Sockets,我是个新来的使用插座的人 我必须在linux环境下,在用户空间中实现LACP协议。每台计算机定期为每个以太网接口发送一条控制消息,即一个结构LACPDUs。 让它们通信的最佳套接字系列是什么(原始、数据包、TCP、UDP)?套接字发送/接收必须是同一类型 我的应用程序已经很好地发送了LACPDU,但另一端的应用程序没有接收到它们(我使用wireshark进行捕获,它捕获了数据包,但没有到达应用程序) 以下是我创建套接字的方式: 发送paquet:(即使没有绑定,也可以正常工作) int sock

我是个新来的使用插座的人

我必须在linux环境下,在用户空间中实现LACP协议。每台计算机定期为每个以太网接口发送一条控制消息,即一个结构LACPDUs。 让它们通信的最佳套接字系列是什么(原始、数据包、TCP、UDP)?套接字发送/接收必须是同一类型

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

以下是我创建套接字的方式:

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

int sock,已发送;
结构sockaddr-sa;

如果(sock=socket(AF_INET,sock_PACKET,htons(ETH_P_SLOW))

我不是很确定,但我认为你需要先绑定到接收器中的套接字,然后才能从中接收。它对发送方很好,因为你只是发送,但接收方不知道从何处获取它。所以使用bind,看看是否有效

披露:我不熟悉LACP协议。

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


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

因为您需要发送第2层数据包,数据包sockets是正确的选择。请注意,您使用的
AF_INET/SOCK_PACKET
-组合早就被弃用了。使用
AF_PACKET
作为套接字域,使用
SOCK_RAW
SOCK_DGRAM
作为类型。使用
sendto
/
recvfrom
-调用是正确的方法,但您的初始化基本上是错误的


我建议您查看使用数据包套接字的现有代码(如),看看如何实现。我还建议您查看手册页
数据包(7)
(请参阅)。

好的,非常感谢,我将尝试这种方法,然后发布结果。
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);