Docker run - ошибка привязки: невозможно назначить запрошенный адрес - PullRequest
1 голос
/ 14 апреля 2020

Я использовал программу C для имитации сервера для связи. Когда я пытаюсь превратить эту программу C в образ docker и запустить контейнер, возникает эта ошибка: Ошибка привязки: Невозможно назначить запрошенный адрес

Я пытаюсь создать docker изображение из файла Docker следующим образом:

gcc -static server.c -o server
vi Dockerfile
FROM scratch
ADD server /
CMD ["/server"]
docker build -t testserver
docker run testserver

Ошибка привязки: невозможно назначить запрошенный адрес

docker logs testserver

Ошибка: Нет такого контейнера: testserver

Это сервер . c код

#define MAX_BUF 1024
#define SERVER_PORT 60000
#define SERVER_IP " /Intranet IP/ "

void single_client(int fd)
{
    char recvBuf[MAX_BUF], sendBuf[MAX_BUF];     
    int bytesOfRecv;  


    for (;;)
    {
        memset(recvBuf, 0, MAX_BUF);
        bytesOfRecv = recv(fd, recvBuf, MAX_BUF, 0);
        if (bytesOfRecv < 0)
        {
            perror("Recv error");

            continue;
        }
        else if (bytesOfRecv == 0)
        {
            printf("Client has disconnected...\n");
            close(fd);

            break;
        }
        recvBuf[bytesOfRecv] = '\0';
        printf("Data received is %s\n", recvBuf);


        memcpy(sendBuf, recvBuf, MAX_BUF);
        send(fd, sendBuf, MAX_BUF, 0);
    }
}

int main()
{
    pid_t pid;
    int lfd, cfd;    
    struct sockaddr_in serverAddr, clientAddr;    
    socklen_t cliAddrLen = sizeof(clientAddr);   

    lfd = socket(AF_INET, SOCK_STREAM, 0);
    if (lfd < 0)
    {
        perror("Socket error");

        exit(1);
    }

    memset(&serverAddr, 0, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(SERVER_PORT);
    serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);   

    int opt = 1;
    int ret = setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, (void *) &opt, sizeof(opt));
    if (ret < 0)
    {
        perror("Setsockopt error");

        exit(1);
    }


    if ((bind(lfd, (struct sockaddr *) &serverAddr, 16)) < 0)
    {
        perror("Bind error");

        exit(1);
    }


    if (listen(lfd, SOMAXCONN) < 0)
    {
        perror("Listen error");

        exit(1);
    }
    printf("Waiting...\n");

    for (;;)
    {
        //Accept
        cfd = accept(lfd, (struct sockaddr *) &clientAddr, (socklen_t *) &cliAddrLen);
        if (cfd < 0)
        {
            perror("Accept error");

            continue;
        }


        printf("Connected from %s:%d\n", inet_ntoa(clientAddr.sin_addr), htons(clientAddr.sin_port));

        if ((pid = fork()) == 0)
        {
            single_client(cfd);
            close(cfd);

            exit(0);
        }

        close(cfd);
    }

    return 0;
}
...