2012-07-18 2 views
1

TCP 서버 소켓을 열고 적어도 하나의 연결을 허용하고 수신 된 모든 데이터를 에코 백하는 TCP Echo 프로그램을 작성하려고합니다. 최소한이 프로그램은 지정된 포트 (exe : port 4444 ")에서 실행되고 실행되어야합니다. 이상적으로 포트 번호 (명령 줄, 명령 줄 매개 변수 또는 구성 파일에서)를 요청하고 해당 포트에서 열려고 시도하며,TCP Echo 프로그램을 작성 하시겠습니까?

이 프로그램은 Windows 또는 Linux의 telnet 명령 또는 모든 OS의 터미널 에뮬레이터를 사용하여 테스트해야하는데,이 사용은 텔넷이나 하이퍼 터미널을 사용하여 실행중인 프로그램에 연결됩니다. 에 즉시 반향한다 지금까지

을 나는 다음과 같습니다.

#include <stdio.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <netinet/in.h> 
#include <errno.h> 


#define MAXCONNECTING 1000 //Max connection requests 
#define BUFFERSIZE 128  //limits data sent per loop 
#define ECHOPORT 4444 


//Error checking function 
//Will be called multiple times to check for errors throughout the code 

void ERR(char *ERROR) { 
    perror(ERROR); 
    exit(1); 
} 

/**************************************************************************** 
* Handles the connection. Receive/Send data from/to client 
****************************************************************************/ 
void ClientHandle(int sock) { 
    char buffer[BUFFERSIZE]; 
    int received = -1; 

    //receive the data 
    if ((received = recv(sock, buffer, BUFFERSIZE, 0)) < 0) { 
     ERR("Failed to receive message from client"); 
    } 

    //send data and check for more incoming data 
    while (received > 0) { 
     if (send(sock, buffer, received, 0) != received) { 
      ERR("Failed to send data to client"); 
     } 
     if ((received = recv(sock, buffer, BUFFERSIZE, 0)) < 0) { 
      ERR("Failed to receive additional data from client"); 
     } 
    } 
    close(sock); 
} 

int main(int argc, char *argv[]) { 
    /**************************************************************************** 
    * Get port number from command line and set to default port 
    ****************************************************************************/ 
    char *endptr; 
    short int port; 

    if (argc == 2) { 
     port = strtol(argv[1], &endptr, 0); 
     if (*endptr) { 
      fprintf(stderr, "EchoServer: Invalid Port Number.\n"); 
      exit(EXIT_FAILURE); 
     } 
    } else if (argc < 2) { 
     port = ECHOPORT; //port 4444 
    } else { 
     fprintf(stderr, "EchoServer: Invalid arguments.\n"); 
     exit(EXIT_FAILURE); 
    } 

    /**************************************************************************** 
    * Server Configuration. Creating the socket 
    ****************************************************************************/ 

    int serversock, clientsock; 
    struct sockaddr_in echoserver, echoclient; 

    if (argc != 2) { 
     fprintf(stderr, "USING: echoserver Port: 4444\n"); 
     exit(1); 
    } 
    //Creating the TCP socket 
    if ((serversock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 
     ERR("Failed to create socket"); 
    } 
    //Constructing the server sockaddr_in structure 
    memset(&echoserver, 0, sizeof(echoserver)); //clear struct 
    echoserver.sin_family = AF_INET;    //internet ip 
    echoserver.sin_addr.s_addr = htonl(INADDR_ANY); //listen to any ip address 
    echoserver.sin_port = htons(atoi(argv[1])); //server port 


    /***************************************************************************** 
    * Bind and Listen 
    *****************************************************************************/ 
    if (bind(serversock, (struct sockaddr *) &echoserver, sizeof (echoserver)) < 0) { 
     ERR("Failed to bind the server socket"); 
    } 
    if (listen(serversock, MAXCONNECTING) < 0) { 
     ERR("Failed to listen on server socket"); 
    } 

    /***************************************************************************** 
    * Accepting the transmission 
    *****************************************************************************/ 
    while (1) { 
     unsigned int clientleng = sizeof (echoclient); 

     if ((clientsock = accept(serversock, (struct sockaddr *) &echoclient, &clientleng)) < 0) { 
      ERR("Failed to accept connection from client"); 
     } 
     fprintf(stdout, "Client connected: %s\n", inet_ntoa(echoclient.sin_addr)); 
     ClientHandle(clientsock); 
    } 
    return (0); 
} 

/*****************************************************************************************/ 

사람이 w를 볼 수 여기 내가 잘못 갔어? 나는 명령을 사용하여 단말기에서 프로그램을 찾을 수 있습니다 : g ++ 다음 EchoServer.cpp -0 EchoServer 다음 : 사용 : ./EchoServer

가 OUPUT은 저를 제공 echoserver 포트 : 나는 시도하고 4444

텔넷으로 연결하는 것이지만, 나는이 물건에 아주 새로운 것이다. 도와주세요!! 당신 것,

g++ EchoServer.cpp -o EchoServer 

은 컴파일 후 :

+0

이것을 작성 했으므로 수신 포트를 인수로 지정해야합니다. 즉, './EchoServer 4444'로 시작해야합니다. 어떤 다른 특정 문제가 있습니까? – nos

+0

죄송합니다 무슨 뜻인지 이해가 안됩니다. 나는 어제 소켓에 처음 소개 된이 물건에 아주 익숙하다. 예를 보여줄 수 있습니까? – Zonxwedop

+0

그리고 대답하기 위해, 나는 명령 프롬프트에서 줄을 긋고 Enter 키를 누르고 프로그램이 내가 쓴 것을 정확히 되돌릴 수있는 곳으로 가져 가고 싶습니다. – Zonxwedop

답변

0

현재 디렉토리에 EchoServer.cpp라는 파일에 위의 텍스트 상자의 내용을 가지고 있다고 가정하면, 당신은 작업을 보여주기 위해 다음 코드를 실행할 수 있습니다 같은 디렉터리에 EchoServer라는 실행 파일이 있습니다.

방금 ​​호출하면 아래의 암호 메시지가 표시됩니다. 즉, 실행 파일을 사용하려면 사용할 포트 번호를 알려야합니다.

USING: echoserver Port 4444 

작동을 입증하기 위해 프로세스를 배경으로 설명 할 것입니다. 이렇게하려면 앰퍼샌드 (&)를 사용하여 작업으로 변환하십시오. 따라서,

EchoServer 4444 & 

이 작업의 수를 반환해야하고, 프로세스 식별자 (당신은 다를 수 있습니다) :

[1] 53912 
당신은이 작업을 사용하여 실행되는 것을 볼 수 있습니다

명령을 :

[1]+ Running     ./EchoServer 4444 & 

당신은 이제 작동하는지 확인하려면이 텔넷 수 있습니다

telnet localhost 4444 

당신은 볼 수 : 당신은 Enter 키 또는 Return 키를 누를 때이 후 입력

Trying 127.0.0.1... 
Client connected: 127.0.0.1 
Connected to localhost. 
Escape character is '^]'. 

아무것도 당신에게 다시 전송됩니다. Hello를 입력하고 return을 눌러보십시오.

작업이 끝나면 제어 키를 누른 다음 닫는 대괄호 키를 누른 상태로 유지할 수 있습니다 (나중에 회귀 키를 눌러야 할 수도 있음). 그러면 텔넷 프롬프트가 나타나며 quit을 입력해야합니다.

EchoServer 실행 파일을 닫으려면 Ctrl-C 키를 사용하여 작업을 포 그라운드로 되돌리고 중지 할 수 있습니다. 작업 1이 (당신이 번호를 확인하기 위해 다시 jobs를 실행할 수 있습니다)라고 가정하면, 포 그라운드로 다시 가져올 다음 명령을 실행할 수 있습니다

fg 1 

당신은 효과적으로 EchoServer 과정에있다, 눌러 Control-C가 종료합니다.

그게 전부 야! 너 끝났어. 프로그램 작동을 성공적으로 시연했습니다.

관련 문제