2012-02-15 9 views
0

私は新しいソケットを使用しています。LACPの実装は、使用する正しいソケットは何ですか?

私はLACPプロトコルのユーザー空間でlinux環境で実装する必要があります。各コンピュータは、各イーサネットインタフェース毎に制御メッセージLACPDUを周期的に送信する。 (RAW、PACKET、TCP、UDP)の通信に最適なソケットの種類は何ですか?ソケットの送受信は同じタイプでなければなりませんか?

私のアプリケーションは既にLACPDUsをうまく送信していますが、相手側のアプリケーションはそれらを受信しません(私はwiresharkでキャプチャしていましたが、パケットをキャプチャしていますが、

これは私がソケットを作成する方法である:

送信パケ:(これも結合することなく、[OK]を作品)

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); 

パケット受信:(このdoesntの仕事を)

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

レイヤ2パケットを送信する必要があるため、パケットソケットが正しい選択です。あなたが使用しているAF_INET/SOCK_PACKETの組み合わせは、ずっと前から廃止されていますのでご注意ください。ソケットドメインにAF_PACKETを使用し、種類としてSOCK_RAWまたはSOCK_DGRAMのいずれかを使用します。 sendto/recvfrom -callsを使用するのが適切ですが、初期化はほとんど間違っています。

パケットソケットを使用してその処理方法を確認する既存のコード(thisなど)をご覧になることをお勧めします。また、packet(7)hereを参照)のマンページをご覧ください。

+0

ありがとう、私はこの方法で試してみると、私は結果を投稿します。 –

0

私は本当にわかりませんが、私はあなたが受信する前に受信機のソケットにバインドする必要があると思います。あなたが送信しているだけなので送信側でうまく動作しますが、受信側はどこから受信するのかわかりません。だからバインドして、それが動作するかどうかを確認してください。

開示:私はLACP protcolに精通していません。

0

LACPは、レイヤ2(データリンクレイヤ)プロトコルです。あなたのコードはLACPフレームをUDPパケットとして送信しようとしていますが、影響はありません。

送信コードにstruct sockaddrを完全に記入しておらず、受信コードにソケットをバインドしていないため、コードが特に機能しません。ただし、このアプローチは実際のLACPパケットではまったく機能しません。おそらくrawソケットを使用する必要があります。

関連する問題