C应用程序服务器/客户端在Docker容器中不起作用

我是Docker的新手。 我写了一个服务器/客户端(非常简单)的应用程序,他们都在同一个容器中运行。

我正在使用OSX,当我将客户端连接到服务器时,它工作得很好。

但是,我无法将我的客户端连接到我的服务器。 这是我的代码:

client.c:

#include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int sockfd = 0, n = 0; char recvBuff[1024]; struct sockaddr_in serv_addr; if(argc != 2) { printf("\n Usage: %s <ip of server> \n",argv[0]); return 1; } memset(recvBuff, '0',sizeof(recvBuff)); if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Error : Could not create socket \n"); return 1; } memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(5000); if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0) { printf("\n inet_pton error occured\n"); return 1; } int connect_value = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (connect_value < 0) { printf("Value of connect_value %d\n", connect_value); fprintf(stderr, "Value of errno: %d\n", errno); return (1); } while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0){ recvBuff[n] = 0; if(fputs(recvBuff, stdout) == EOF) printf("\n Error : Fputs error\n"); } if(n < 0) printf("\n Read error \n"); return 0; } 

server.c

 #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <time.h> int main(int argc, char *argv[]) { int listenfd = 0, connfd = 0; struct sockaddr_in serv_addr; char sendBuff[1025]; time_t ticks; listenfd = socket(AF_INET, SOCK_STREAM, 0); memset(&serv_addr, '0', sizeof(serv_addr)); memset(sendBuff, '0', sizeof(sendBuff)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(5000); bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); listen(listenfd, 10); while(1) { connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); ticks = time(NULL); snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks)); write(connfd, sendBuff, strlen(sendBuff)); close(connfd); sleep(1); } } 

我用来启动我的容器的命令行:

 docker run -it --security-opt seccomp=unconfined --mount type=bind,src=/Users/steven/Documents/eip/firmware_coit,dst=/bidon 987steven/eip_linux bash 

我编译并运行如下:

gcc server.c -o server && ./server

gcc client.c -o client && ./client 127.0.0.1

错误:连接失败值

connect_value -1

errno的价值:111

我在SO之前试图找出自己,但大部分的主题,并阅读:

  • 如何将unix-socket连接到docker-demon
  • docker.sock
  • docker集装箱联网(官方文档)

但没有find任何可以解决我的问题的东西。

只是要清楚,我在networking上有很less的知识,而在docker工作的新手。 请随时问,如果你节点从我的额外信息。 谢谢

问题解决 !

我用以下方式启动我的容器:

  docker run -it --security-opt seccomp=unconfined --mount type=bind,src=/Users/steven/Documents/eip/firmware_coit,dst=/bidon 987steven/eip_linux bash 

但我只需要添加到命令行:

 --net="host" 

或者,您可以运行networking设置为主机的docker工具容器。 这样的容器将与docker主机共享networking堆栈,并且从容器的angular度来看,localhost(或127.0.0.1)将引用docker主机。

来源: 从Docker容器内部,如何连接到本机的本地主机?