1

TCP サーバーソケットを開き、少なくとも 1 つの接続を受け入れ、受信したデータをエコーバックする TCP Echo プログラムを作成しようとしています。少なくとも、このプログラムは指定されたポート (exe: ポート 4444") で起動して実行する必要があります。理想的には、(コマンド ライン、コマンド ライン パラメーター、または構成ファイルから) ポート番号を要求し、そのポートで開こうとします。エラーが発生したかどうかを報告します。

このプログラムは、windows または Linux、または任意の OS の任意の端末エミュレーターから 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);
}

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

私がどこで間違ったのか誰にもわかりますか?次のコマンドを使用して端末でプログラムを見つけることができます: g++ EchoServer.cpp -0 EchoServer に続いて: ./EchoServer

出力は私だけを与えます: USING: echoserver Port: 4444

私はそれにtelnetしようとしていますが、私はこのことについて非常に新しいです。助けてください!!

4

1 に答える 1