TCP Server C ++ / Unix командной строки

0

Я программирую TCP-сервер в C++, и это мой первый раз. Проблема, с которой я сталкиваюсь, по-видимому, направлена на дно с функцией strcmp. Я установил сервер, затем я разблокировал свои процессы и запустил запрос из дочернего процесса. Это прекрасно работает. По какой-то причине, когда я ввожу GET/stuff/ он не примет GET и автоматически распечатает сообщение об ошибке "Invalid first argument". У меня нет проблем с пространством, так что же сделка? Любые идеи очень ценятся.

void processClientRequest(int connSock, struct sockaddr_in echoclient) //char *argv[] )
{
    char buffer[256];
    unsigned int recieved, count = 0;

    if ((recieved = read(connSock, buffer, 256)) < 0) { //read a message from the client
            perror ("Failed to recieve message");
            exit (EXIT_FAILURE);
    }

    buffer[recieved] = '\0'; //ensure string is terminated
    chomp(buffer); //remove trailing \r and \n

    if (write(connSock, buffer, recieved) != recieved) {
            perror ("Mismatch in number of echo'd bytes");
            exit(EXIT_FAILURE);
    }

    // prepare argv array of strings
    char *argv[] = { (char*)0, (char*)0, (char*)0, (char*)0, (char*)0, (char*)0, (char*)0 };

    // parse command into words
    for (char *p = strtok(buffer, " "); p; p = strtok(NULL, " "))
            {   argv[count] = p;
                    count++;
            }

    cout << "THIS IS ARGV[0]" << argv[0] << endl; //debugging, for some reason will not print

    if (strcmp (argv[0], "GET") == 0)
            GET(connSock, argv[1]);

    else if (strcmp(argv[0], "INFO") == 0)
            INFO();

    else
    {
            perror("Invalid first argument!");
            exit(EXIT_FAILURE);
    }

    // run command and its arguments via execvp
    /*      if (execvp(argv[0], argv) < 0) {
            perror("exec in child after fork");
            exit(EXIT_FAILURE);
            }*/

    cerr << "Client(" << inet_ntoa(echoclient.sin_addr) << ") sent: " << buffer << endl;

}
  • 0
    извините быть педантичным, но оно должно быть received ;)
  • 0
    Если вы пишете код C ++, почему бы не использовать POCO ?
Теги:
tcp

1 ответ

1
Лучший ответ

Функция read не принимает сообщения, она принимает байты. Если вы хотите получать сообщения, и вы это делаете, вам нужно написать функцию для их получения. Это требует соблюдения правил HTTP-протокола для хранения байтов до тех пор, пока у вас не будет всего messsage, будь то строка, весь заголовок или что-то еще.

Это, вероятно, говорилось тысячи раз: "TCP - это надежный протокол байтового потока, который не сохраняет границы сообщений приложения". Пока вы на 100% не поймете, что такое TCP, не пишите код, который использует TCP. Он никогда не будет работать правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню