2017-10-25 3 views
0

Ich bin ein Neuling mit Docker. Ich schreibe eine Server/Client (sehr einfache) Anwendung, die beide im selben Container laufen.C Anwendungsserver/Client funktioniert nicht in Docker Container

Ich arbeite an OSX und es funktioniert perfekt, wenn ich den Client mit dem Server verbinden.

Allerdings kann ich meinen Client nicht mit meinem Server verbinden. Hier ist mein Code:

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); 
    } 
} 

die Befehlszeile ich meinen Container starten:

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

ich kompilieren und ausführen mit dem folgenden Weg:

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

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

Fehler: Verbindung fehlgeschlagen Wert von

connect_value - 1

Wert von errno: 111

Ich versuchte, von mir zu auf SO, bevor Post herausgefunden, aber die meisten von dem Thema und lesen Sie über:

  • wie Unix-Socket Andockfenster-Dämon
  • docker.sock
  • Docker Behälter Vernetzung verbinden (offizielle Dokumentation)

Aber habe nichts gefunden, das mein Problem lösen könnte.

Nur um klar zu sein, dass ich ein sehr wenig Wissen im Netzwerk im Allgemeinen und Neuling in Docker habe. Bitte zögern Sie nicht zu fragen, ob Sie zusätzliche Informationen von mir Knoten. Danke

+0

Was der Rückgabewert von connect ist() nennen? Es ist weniger als 0 aber was ist es? Versuchen Sie das herauszufinden, es wird Ihnen helfen. – Mazhar

+0

Welchen Befehl haben Sie für connect ausgeführt und haben Sie Server und Client in denselben Containern ausgeführt? –

+0

Hallo @ Mazhar und TarunLalwani. Ich bearbeite meinen originalen Post :) (Und ja, ich betreibe den Server und den Client in denselben Containern) –

Antwort

0

Problem lösen!

Früher habe ich meine Container mit folgenden Weise zu starten:

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

Aber ich brauche nur an die Befehlszeile hinzuzufügen:

--net="host" 

Alternativ können Sie Docker Behälter laufen mit Netzwerkeinstellungen auf Host festlegen. Ein solcher Container teilt sich den Netzwerkstack mit dem Docker Host, und aus der Sicht des Containers bezieht sich localhost (oder 127.0.0.1) auf den Docker-Host.

Quelle: From inside of a Docker container, how do I connect to the localhost of the machine?

Verwandte Themen