2011-07-04 6 views
1

すべてのUDPパケットを読み取るアプリケーション用のカーネルスレッドを作成します。これらのパケットがポート範囲(5001〜5005など)に到達する可能性があるので、私はバインディングの問題に直面しています。UDPソケットをポート範囲にバインドする方法

これを行う方法。 ポインタ/リンクは参考になります。

+0

のに役立ちますか? –

+1

5つのソケットを開きます。それぞれのポートに1つずつ、リッスンする必要があります。 – Heisenbug

答えて

2

あなたは、複数のポートにソケットをバインド0verboseコメントで示唆されているように行うと、複数のソケットを開くほかのポート

2

につき1つのソケットを使用することはできません、あなたが選択()/ポールを(使用する必要があります)一度にすべてのソケットを聴くことができます。 あなたはここに、LinuxでC/C++でプログラミングしている場合は、擬似コードはC:

#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h> 

... 

int main() 
{ 
    fd_set afds; 
    fd_set rfds; 
    int maxfd = -1; 
    int fd, ret; 

    /* initialize fdsets */ 
    FD_ZERO(&afds); 

    /* create a socket per port */ 
    foreach (port p) { 
     fd = create_udp_socket(p); /* also bind to port p */ 
     if (fd < 0) error_exit("error: socket()\n"); 
     FD_SET(fd, &afds); 
     if (fd > maxfd) maxfd = fd; 
    } 

    while (1) { 
     memcpy(&rfds, &afds, sizeof(rfds)); 

     /* wait for a packet from any port */ 
     ret = select(maxfd + 1, &rfds, NULL, NULL, NULL); 
     if (ret < 0) error_exit("error: select()\n"); 

     /* which socket that i received the packet */ 
     for (fd=0; fd<=maxfd; ++fd) 
      if (FD_ISSET(fd, &rfds)) 
       process_packet(fd); /* read the packet from socket fd */ 

    } 

} 

希望は、このコードを使用すると、どのようなプログラミング言語を使用しています

関連する問題