-2

小さな http サーバーを含むアプリケーションを開発しました。

私のアプリケーションはブートで起動されます。(kill -9たとえば)それを強制終了すると、httpサーバーポートは別のデーモン(broadcomのacsd)によって直接取得されます。

drop-bear で同じ動作を試してみましたが、問題は再現しません。drop-bear を強制終了すると、acsd はそのポートを取得しません。

ここに私のサーバーのコードの後:

void http_server_init(void)
{
    struct sockaddr_in server;
    int cr_port;

    for(;;) {
        cr_port = conf.port;
        int i = (DEFAULT_PORT == cr_port)? 1 : 0;
        //Create socket
        cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0);
        if (cr_socket_desc == -1)
        {
            LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno));
            sleep(1);
            continue;
        }

        /* enable SO_REUSEADDR */
        int reusaddr = 1;
        if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0) {
            LOG (WARNING,"setsockopt(SO_REUSEADDR) failed");
        }

        //Prepare the sockaddr_in structure
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        for(;;i++) {
            server.sin_port = htons(cr_port);
            //Bind
            if( bind(cr_socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
            {
                //print the error message
                LOG (ERROR,"Could not bind server socket on the port %d, Error no is : %d, Error description is : %s", cr_port, errno, strerror(errno));
                cr_port = DEFAULT_PORT + i;
                LOG (INFO,"Trying to use another port: %d", cr_port);
                continue;
            }
            break;
        }
        break;
    }
    LOG (INFO,"server initiated with the port: %d", cr_port);
}

http サーバーで何が間違っていますか?

4

2 に答える 2

-2

私の質問に対する回答がないからです。その問題に対する回答を共有したいと思います。

SO_REUSEADDRソケットが閉じられておらず、オプションが設定されているため、acsd サービスはポートを取得します。

于 2015-01-31T09:42:57.010 に答える