2012-01-18 25 views
0

私は現在、ポート2368にUDPデータストリームを配信するレーザーセンサーを使っています。私はWiresharkでパケットを見ることができます。ポート2368からUDPストリームを受信できません(Linux)C

私は画像を投稿することができないんだけど、私はWiresharkのパケットのために示して何を書く:

出典:192.168.17.141 先:192.168.3.255 プロトコル:UDP 送信元ポート:HTTPS(443 ) 宛先ポート:がopentable(2368)

しかし、私は次の例のCプログラムでソケットを使用してパケットを読みたい:

int main(int argc, char *argv[]) 
{ 
    int sock, n, res; 
    unsigned int length = 1206; 
    char* buffer = new char[1206]; 

    sock= socket(AF_INET, SOCK_DGRAM, 0); 
    if (sock < 0) error("socket"); 

    uint16_t udp_port = 2368; 
    sockaddr_in my_addr;      
    socklen_t len = sizeof(sockaddr_in); 
    memset(&my_addr, 0, sizeof(my_addr)); 
    my_addr.sin_family = AF_INET;   
    my_addr.sin_port = htons(udp_port);  
    my_addr.sin_addr.s_addr = INADDR_ANY; 

    cout << my_addr.sin_family << endl; 
    cout << my_addr.sin_port << endl; 
    cout << my_addr.sin_addr.s_addr << endl; 


    res = bind(sock, (sockaddr *)&my_addr, sizeof(sockaddr_in)); 
    if (res == -1) 
    { 
     perror("bind");     
     return -1; 
    } 


    while (true) 
    { 
     n = recvfrom(sock,buffer,1,0,NULL,NULL); 
     if (n < 0) error("recvfrom"); 
    } 

    close(sock); 
    return 0; 
} 

PROGRをamは成功するまでrecvfrom()になります。そこでは、ソケットはパッケージを待っていて、何も受信しません。私はWindows用の同じプログラムをWinsockで書いており、完全に機能しました。私はLinux OSに比較的新しいので、この問題を解決する方法はわかりませんし、アドバイスに感謝しています!

追加情報:I手動ETH4にIPとネットマスク(これはデバイスが接続されているインタフェースである)以下の割り当て:

IP:192.168.3.5 NM:255.255.255.0

+2

あなたのプログラムは、C++クラスiostreamの一部である 'cout'変数を使用するので、CではなくC++です。 –

+3

192.168.3.255はネットマスク255.255.255.0のブロードキャストアドレスになります。通常、SO_BROADCASTソケットオプションを有効にしてこれらのパケットを受信する必要があります。しかし192.168.17.141がマシンに送信された場合、/ 24ネットワークのブロードキャストアドレスに送信することはできませんので、ここでネットマスクとのミックスアップが必要です。 – nos

+2

1オクテットサイズのパケットが必要ですか? – wildplasser

答えて

0

あなたは

を持っています
IP: 192.168.3.5 NM: 255.255.255.0 

Source: 192.168.17.141 Destination: 192.168.3.255 

ルーターが関与していない場合、これは機能しません。合間対策として

IP: 192.168.3.5 NM: 255.255.0.0 

を試してみてください、しかし、IP

編集をよく読んでください:たぶん、より良い外観をあなたのレーザーセンサーに直接ご192.168.3.5先で192.168.3.[something free]にそれを設定し、以降の放送をデバッグします。

+0

お返事ありがとうございます!残念ながらセンサーのIPを変更することはできません!あなたの提案した設定を試しましたが、成功しませんでした。 – user1156079

+0

センサーのIPを変更できない場合は、宛先とLinuxホストのIPを192.168.17.xの範囲に変更することができます。これが不可能な場合は、ブロードキャスト対応ルータが必要です。 Windows上でどのIP設定を使用しましたか? –

+0

私は上記の設定(192.168.3.5,255.255.255.0)と同じ設定を私のWindowsアプリケーションに使いました。 IPを192.168.17.5に設定しただけですが、まだパッケージはありません。何かがポート2368をブロックしている可能性はありますか? – user1156079

0
char buffer[1200+6]; /* no need for dynamic buffers */ 
... 
n = recvfrom(sock, buffer, sizeof buffer, 0, NULL, NULL); 

ところでのrecvfromの使用状況は、()

n = recv(sock, buffer, sizeof buffer, 0); 

、あるいは同等です:

SO_BROADCASTオプションを設定
n = read(sock, buffer, sizeof buffer); 
1

、でも受信します。ソケットによると、(7)のmanページ:

SO_BROADCAST:
設定またはブロードキャストフラグを取得します。有効にすると、データグラムソケットはブロードキャストアドレスに送信されたパケットを受信し、ブロードキャストアドレスにパケットを送信できます。このオプションはストリーム指向のソケットには影響しません。

また、インターフェイスの設定が正しくない可能性があります。問題のインターフェイスに対して192.168.3.xxx/24アドレスが設定されていることを確認します。

関連する問題