Создать строку протокола из строки, удаляющей \ n и \ 0 - PullRequest
1 голос
/ 08 ноября 2019

Нам нужно создать приложение p2p для текстового сообщения с C. Мы уже установили соединение p2p с использованием интерфейса TCP, но у нас возникли проблемы с реализацией протокола для отправки и чтения сообщений.

Сообщения должны быть в следующем формате:

Строка - это сообщение, которое мы хотим отправить и прочитать. Сообщение будет начинаться с 3 символов, чтобы указать размер строки (например, 005).

Затем будет строка, которую мы хотим написать или прочитать (например, привет).

Итаксообщение должно быть char t [] и для этого примера это будет 005 hello. Никакие «\ n» или «\ 0» не должны быть отправлены или прочитаны, только размер и строка.

Мы читаем и пишем сообщения, используя клавиатуру, используя системы вызовов read () и write (), поэтому мымы знаем, что у нас будут '\ n' и '\ 0', которые мы хотим удалить.

Мы попытались реализовать 2 функции, которые не работают как намерение. MI_SendLine (int Socket, const char * Line) и MI_ReceiveLine (int Socket, const char * Line).

MI_SendLine должен преобразовать * строку в описанный протокол, поэтому строка «привет» будет преобразована в «005hello "," hello \ 0 \ n "будет преобразовано в" 005hello "," thx для вашего времени \ n "будет" 017thx для вашего времени ".

Для функции receiveLine у ​​нас то же самоепроблем, поэтому код будет опущен.

int MI_SendLine(int Socket, const char *Line)
{
    //PROTOCOL TRANSFORMATION
    //3 chars reserved for size of msg
    char message[3 + strlen(Line)];

    int size = strlen(Line);
    int j;
    for(j = 2; j >= 0; j--){
        message[j] = (size % 10) + '0';
        if(size > 0)
            size /= 10;
    }

    int i;
    for(i = 3; i < strlen(Line) + 3; i++){
      message[i] = Linia[i - 3];
    }

    //END PROTOCOL TRANSFORMATION
    return TCP_Send(Socket, message, sizeof(message));
}

Функция TCP, она была протестирована и работает правильно

int TCP_Sent(int Sck, const char *SeqBytes, int LongSeqBytes)
{
    int bytes_written;
    if((bytes_written=write(Sck,SeqBytes,LongSeqBytes))==-1){
        perror("error en write");
        close(Sck);
        exit(-1);
    }

    return bytes_written;
}

Мы ожидаем, что вывод "hello \ n" будет«005hello», но фактическим выводом является таблица символов, заполненных неизвестными символами.

Пример: 1-е сообщение: введите «aaa», получено сообщение «aaa?»но это не так? само по себе, это странный символ, содержащий его.

2n сообщение: введите "b" полученное сообщение "b?.

3-е сообщение: введите" ccccc "полученное сообщение" ccccc ", но без

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Если вы имеете в виду, как получить символы из строки без символа новой строки и символа, заканчивающегося нулем, то вот демонстрационная программа, которая показывает, как это можно сделать с помощью стандартной функции C strcspn.

* 1003. *

Вывод программы

"017thx for your time"
1 голос
/ 08 ноября 2019

Ваш код выглядит нормально. Мусор должен быть результатом ошибки в приемнике. Вы забыли добавить NUL или у вас возникла какая-то ошибка:

Что касается удаления перевода строки, просто уменьшите размер и скопируйте на один символ меньше, если последний является переводом строки. .

int MI_SendLine(int Socket, const char *Line)
{
    size_t len = strlen(Line);    
    if (len > 0 && Line[len-1] == '\n')
        --len;

    if (len > 999) {
        fprintf(stderr, "Message too big!\n");
        exit(1);
    }

    char message[3+len];
    message[0] = '0' + len / 100 % 10;
    message[1] = '0' + len / 10 % 10;
    message[2] = '0' + len % 10;
    memcpy(message+3, Line, len);
    return TCP_Send(Socket, message, 3+len);
}

или

    // sprintf needs space for a NUL even if we don't send it.
    char message[3+len+1];
    sprintf(message, "%03d%s", len, Line);
    return TCP_Send(Socket, message, 3+len);

или

    char prefix[4];
    sprintf(prefix, "%03d", prefix);
    return TCP_Send(Socket, prefix, 3) + TCP_Send(Socket, Line, len);

Обратите внимание, что это не проверяет, есть ли какие-либо переводы строк в середине строки.

...