Docker运行-绑定错误:无法分配请求的地址
我使用一个C程序来模拟服务器进行通信。当我试图将此C程序制作成docker映像并启动容器时,出现以下错误:绑定错误:无法分配请求的地址 我尝试从docker文件中创建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
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;
}