0

異なるポートに 4 つのソケットをバインドしたいと考えています。どういうわけか、常に: Address already in useエラーが発生します。最初のループでcase PORT1は機能していますが、2 回目の実行では上記のエラーが発生します。誰かが私のコードを詳しく見てくれるといいのですが。

出力は次のようになります。

thread 0 started, pc_packet_receiver 
sock_fd[8]
sock_fd[8], fdmax[8]
sock_fd[9]
error: could not bind UDP socket, port2
: Address already in use

ご覧のとおり、最初printfのループは 2 回処理され、プログラムbindが呼び出されるとPORT2クラッシュします。

  • sock_fdファイル記述子の配列です
  • sock_addr_port[1..4]4つの異なるstruct sock_addr
  • PORT1/PORT2/PORT3/PORT4enum [1..4]
  • 最後に、それらを処理するためにすべてsock_fd[i]をに追加したいFD_SETselect

よろしくお願いいたします。

for(i = 0; i < 4; i++) {

    if((sock_fd[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("error: could not open UDP socket\n");
        exit(EXIT_FAILURE);
    }

    printf("\tsock_fd[%d]\n", sock_fd[i]);

    switch (i+1) {
        case PORT1:
            bzero(&sock_addr_port1, sock_len_port1);
            sock_addr_port1.sin_family = AF_INET;
            sock_addr_port1.sin_port = htons(ETH_PORT1);
            sock_addr_port1.sin_addr.s_addr = htonl(INADDR_ANY);

            if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port1, sock_len_port1) < 0) {
                perror("error: could not bind UDP socket, port1\n");
                exit(EXIT_FAILURE);
            }

            break;
        case PORT2:
            bzero(&sock_addr_port2, sock_len_port2);
            sock_addr_port2.sin_family = AF_INET;
            sock_addr_port2.sin_port = htons(ETH_PORT2);
            sock_addr_port2.sin_addr.s_addr = htonl(INADDR_ANY);

            if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port2, sock_len_port2) < 0) {
                perror("error: could not bind UDP socket, port2\n");
                exit(EXIT_FAILURE);
            }

            break;
        case PORT3:
            bzero(&sock_addr_port3, sock_len_port3);
            sock_addr_port3.sin_family = AF_INET;
            sock_addr_port3.sin_port = htons(ETH_PORT3);
            sock_addr_port3.sin_addr.s_addr = htonl(INADDR_ANY);

            if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port3, sock_len_port3) < 0) {
                perror("error: could not bind UDP socket, port3\n");
                exit(EXIT_FAILURE);
            }

            break;
        case PORT4:
            bzero(&sock_addr_port4, sock_len_port4);
            sock_addr_port4.sin_family = AF_INET;
            sock_addr_port4.sin_port = htons(ETH_PORT4);
            sock_addr_port4.sin_addr.s_addr = htonl(INADDR_ANY);

            if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port4, sock_len_port4) < 0) {
                perror("error: could not bind UDP socket, port4\n");
                exit(EXIT_FAILURE);
            }

            break;
        default:
            break;
    }

    FD_SET(sock_fd[i], &read_fds);
    fdmax = sock_fd[i];
    printf("sock_fd[%d], fdmax[%d]\n", sock_fd[i], fdmax);
}
4

1 に答える 1