我是新手使用套接字。
我必须在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);
任何想法?感谢。
答案 0 :(得分:0)
我不太确定,但我认为你需要绑定到接收器中的那个套接字才能恢复。它对发送方工作得很好,因为你只是发送,但接收方不知道从哪里抓取它。所以使用bind并查看是否有效。
披露:我不熟悉LACP协议。
答案 1 :(得分:0)
LACP是第2层(数据链路层)协议。您的代码正在尝试将LACP帧作为UDP数据包发送,这不会产生任何影响。
您的代码特别无效,因为您没有在发送代码中完全填写struct sockaddr
,并且没有在接收代码中绑定套接字。但是,这种方法对于实际的LACP数据包根本不起作用;你可能需要使用原始套接字。
答案 2 :(得分:0)