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
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
Welchen Befehl haben Sie für connect ausgeführt und haben Sie Server und Client in denselben Containern ausgeführt? –
Hallo @ Mazhar und TarunLalwani. Ich bearbeite meinen originalen Post :) (Und ja, ich betreibe den Server und den Client in denselben Containern) –