2012-07-18 75 views
1

我正在嘗試編寫一個TCP Echo程序,該程序應該打開一個TCP服務器套接字,接受至少1個連接,並回顯接收到的任何數據。至少,這個程序應該啓動並運行在一個指定的端口(exe:port 4444「)。理想情況下,它會要求一個端口號(從命令行,命令行參數或配置文件)嘗試在該端口上打開,並報告是否發生錯誤編寫一個TCP回聲程序?

該程序應該使用來自Windows或Linux的telnet命令或任何操作系統中的任何終端仿真程序進行測試,使用Telnet或超級終端連接到正在運行的程序。在應立即回顯

到目前爲止,我有以下幾點:。

#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

的輸出中只給了我: 使用:EchoServer的端口:4444

我想telnet到它,但我對這個東西很新。請幫忙!!

+0

正如你所寫的那樣,你應該把它作爲一個參數給監聽端口,也就是說你可以將它作爲'./EchoServer 4444'來啓動。你還有什麼其他的具體問題? – nos 2012-07-18 20:42:58

+0

對不起,我不明白你的意思。我對這個東西非常陌生,因爲昨天是我第一次被介紹給套接字。你能舉個例子嗎? – Zonxwedop 2012-07-18 21:39:04

+0

爲了回答,我特別想讓它到達我可以在命令提示符下寫入一行的位置,然後按回車鍵,程序就會迴應我寫的內容。 – Zonxwedop 2012-07-18 21:49:49

回答

0

假設你有上面的當前目錄稱爲EchoServer.cpp文件文本框的內容,你可以運行下面的代碼來證明它的工作:

g++ EchoServer.cpp -o EchoServer 

它編譯後,你會在同一個目錄下有一個名爲EchoServer的可執行文件。

如果您只是稱它,您將在下面收到隱藏的信息,這意味着要使用可執行文件,您必須告訴它要使用哪個端口號。

USING: echoserver Port 4444 

爲了演示它的工作原理,我們將把這個過程放在後臺。爲此,我們使用&符號(&)將其變成工作。

EchoServer 4444 & 

這將返回一個作業號和進程標識符(你的將是不同的),這樣的:

[1] 53912 

你可以看到它使用的作業運行命令:

[1]+ Running     ./EchoServer 4444 & 

您現在可以telnet到此以查看其正在工作:

telnet localhost 4444 

您應該看到:當您按下Enter鍵或Return此之後您鍵入

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

任何將被送回給你。嘗試輸入Hello並按回車。

一旦你完成,你可以按住控制鍵,然後按住方括號鍵(你可能需要按回車鍵)。這會將您帶入Telnet提示符,並且您應該輸入quit以離開。

要關閉EchoServer可執行文件,可以將作業恢復到前臺並使用Control-C按鍵停止作業。假設你的工作是1(你可以再次運行jobs檢查的人數),您可以運行以下命令將其帶回前臺:

fg 1 

你現在有效的EchoServer的過程中,按下Control-C將結束它。

就是這樣!你完成了。您已成功演示該程序的工作。