2017-11-27 23 views
0

C TCP 클라이언트 - 서버을 만들고 외부 PC에서 액세스하려고합니다. 키의 값을 저장할 수있는 Store입니다. 코드는 다음과 같습니다. 나는 그것을 연결할 수
있는 유일한 방법은 ./file_server 8080 를 실행 한 후 다른 터미널 사용에 연결하는 것입니다 ./file_client 127.0.0.1 8080
을하지만 내 현재의 IP, 그냥 루프와 결코 연결하지 ..내 C 서버에 원격으로 어떻게 연결할 수 있습니까?

CLIENT.C를 사용하는 경우

//create the socket using socket fucntion 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0) { 
    error("ERROR opening socket"); 
} 

//gethostbyname: get the server's DNS entry 
server = gethostbyname(hostname); 
if (server == NULL) { 
    fprintf(stderr,"ERROR, no host named %s\n", hostname); 
    exit(-1); 
} 

//build the server's Internet address 
bzero((char *) &serveraddr, sizeof(serveraddr)); 
serveraddr.sin_family = AF_INET; 
bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr, server->h_length); 
serveraddr.sin_port = htons(portno); 

//Create a connexion with the server 
if (connect(sockfd, &serveraddr, sizeof(serveraddr)) < 0) { 
    error("ERROR connecting"); 
}` 

SERVER.C

parentfd = socket(AF_INET, SOCK_STREAM, 0); //Create the parent 
    socket to be able to loop until a connexion is etablished. 
    if (parentfd < 0) { 
     error("ERROR opening socket"); 
    } 
    optval = 1; 
    setsockopt(parentfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)); 

    bzero((char *) &serveraddr, sizeof(serveraddr)); //Build server's internet address 

    serveraddr.sin_family = AF_INET;      //Internet address 
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);  //our IP 
    serveraddr.sin_port = htons((unsigned short)portno); //Port we will    listen on 


    //Associate the parent socket' address to a port 
    if (bind(parentfd, (struct sockaddr *) &serveraddr, sizeo 
     error("ERROR on binding"); 
    } 

    //We make this socket ready to accept multiples requests (5 here) 
    //It will be useful for the next TP. Here it's not necessary because we will listen to 1 client at a time. 
    if (listen(parentfd, 5) < 0) { 
     error("ERROR on listen"); 
    } 
    clientlen = sizeof(clientaddr); 
+1

N.B. * gethostbyname *(), gethostbyaddr *(), herror() 및 hstrerror() 함수는 더 이상 사용되지 않습니다. 응용 프로그램은 getaddrinfo (3), getnameinfo (3) 및 gai_strerror (3)를 사용해야합니다. * 마찬가지로, * getaddrinfo 함수가 도입되어 gethostbyname 함수가 사용되지 않습니다. Windows 소켓 2 응용 프로그램을 만드는 개발자는 gethostbyname 대신 getaddrinfo 함수를 사용해야합니다. * – red0ct

답변

0

클라이언트 시스템에서 서버로 SSH 터널을여십시오. IP 또는 DNS를 사용하여 클라이언트 시스템에서 SSH 서버에 액세스 할 수 있어야합니다.

SERVER_IP='10.10.128.3' 
ssh -f -L 8080:"$SERVER_IP":80 "$SERVER_IP" 
./file_client 127.0.0.1 8080 

이이 모두를 전달합니다 그 배경에 ssh 프로세스를 시작합니다 :

./file_server 80 

클라이언트 시스템에서 :

IP 10.10.128.3 사용하여 서버에서

의 TCP 서버를 시작 localhost:8080에서 server1:80까지의 트래픽. 포트가 동일 할 필요는 없습니다. 이 예제는 서버를 포트 80에서 실행하고 클라이언트는 포트 8080에서 실행합니다.

+0

그래서 외부 시스템을 사용하고 localhost에서 서버로 ssh 터널을 열면 작동할까요? –

+0

그리고 첫 번째 인수로 주소가있는 file_client를 호출해야합니다. –

+0

서버로 ssh 연결할 수 있으면이 예가 작동합니다. 그것은 테스트하는 좋은 방법이 될 것입니다, 먼저 서버로 ssh하려고, 작동하는지 확인한 다음 ssh 터널을 열고 클라이언트 프로그램을 시도하십시오. – pneumatics