Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker运行-绑定错误:无法分配请求的地址_Docker_Sockets_Docker Image - Fatal编程技术网

Docker运行-绑定错误:无法分配请求的地址

Docker运行-绑定错误:无法分配请求的地址,docker,sockets,docker-image,Docker,Sockets,Docker Image,我使用一个C程序来模拟服务器进行通信。当我试图将此C程序制作成docker映像并启动容器时,出现以下错误:绑定错误:无法分配请求的地址 我尝试从docker文件中创建docker图像,如下所示: gcc -static server.c -o server vi Dockerfile 绑定错误:无法分配请求的地址 错误:没有这样的容器:testserver 这是server.c代码 #define MAX_BUF 1024 #define SERVER_PORT 60000 #define S

我使用一个C程序来模拟服务器进行通信。当我试图将此C程序制作成docker映像并启动容器时,出现以下错误:绑定错误:无法分配请求的地址

我尝试从docker文件中创建docker图像,如下所示:

gcc -static server.c -o server
vi Dockerfile
绑定错误:无法分配请求的地址

错误:没有这样的容器:testserver

这是server.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;
}
#定义最大值为1024
#定义服务器端口60000
#定义服务器IP“/内部网IP/”
无效单_客户端(int fd)
{
char recvBuf[MAX_BUF],sendBuf[MAX_BUF];
int bytesofrev;
对于(;;)
{
memset(recvBuf,0,MAX_BUF);
bytesOfRecv=recv(fd,recvBuf,MAX_BUF,0);
if(字节数小于0)
{
perror(“Recv错误”);
继续;
}
else if(bytesofrev==0)
{
printf(“客户端已断开…\n”);
关闭(fd);
打破
}
recvBuf[bytesofrev]='\0';
printf(“收到的数据是%s\n”,recvBuf);
memcpy(sendBuf、recvBuf、MAX_BUF);
发送(fd,sendBuf,MAX_BUF,0);
}
}
int main()
{
pid_t pid;
国际lfd,cfd;
serverAddr、clientAddr中的结构sockaddr\u;
socklen_t cliAddrLen=sizeof(clientAddr);
lfd=套接字(AF_INET,SOCK_STREAM,0);
if(lfd<0)
{
perror(“套接字错误”);
出口(1);
}
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin\u port=htons(服务器\u端口);
serverAddr.sin\u addr.s\u addr=inet\u addr(服务器IP);
int opt=1;
int ret=setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,(void*)和opt,sizeof(opt));
如果(ret<0)
{
perror(“设置锁定选择错误”);
出口(1);
}
if((bind(lfd,(struct sockaddr*)和serverAddr,16))<0)
{
perror(“绑定错误”);
出口(1);
}
如果(监听(lfd,SOMAXCONN)<0)
{
perror(“侦听错误”);
出口(1);
}
printf(“等待…\n”);
对于(;;)
{
//接受
cfd=接受(lfd,(结构sockaddr*)和clientAddr,(socklen\u t*)和cliAddrLen);
如果(cfd<0)
{
perror(“接受错误”);
继续;
}
printf(“从%s连接:%d\n”、inet\u ntoa(clientAddr.sin\u addr)、htons(clientAddr.sin\u端口));
如果((pid=fork())==0)
{
单一客户(cfd);
关闭(cfd);
出口(0);
}
关闭(cfd);
}
返回0;
}

请将
docker logs testserver的输出粘贴到上面的描述中。由于docker容器无法启动,因此输出为:[错误:没有这样的容器:testserver]您确定端口不是由您在docker之外执行的服务器占用的吗?检查
sudo lsof-i:60000
-另一个可疑对象是您的
服务器IP
-将其更改为
0.0.0
或类似的内容,以测试其是否有任何更改。您尝试绑定到非本地IP地址。除非你有很好的理由不使用INADDR_ANY。请在上面的描述中粘贴
docker logs testserver
的输出。因为docker容器无法启动,所以输出为:[错误:没有这样的容器:testserver]你确定端口不是由你在docker之外执行的服务器占用的吗?检查
sudo lsof-i:60000
-另一个可疑对象是您的
服务器IP
-将其更改为
0.0.0
或类似的内容,以测试其是否有任何更改。您尝试绑定到非本地IP地址。除非你有很好的理由不这样做,否则请使用INADDR_ANY。
docker build -t testserver
docker run testserver
docker logs testserver
#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;
}