c ++, termios, неканонический, блокировка, определение конца сообщения - PullRequest
0 голосов
/ 07 октября 2019

Я написал цикл блокировки для чтения нежелательных сообщений. У меня не может быть символа конца для определения конца сообщения, но я очень доволен временем ожидания. VMIN=1 VTIME=5

Здесь, когда получаемые байты меньше размера буфера, я предполагаю конец сообщения.

Этот код работает, но не будет работать, если сообщение точно33 символа в длину. Есть идеи?

int l = 0;
string o = "";
char buf[33];

while(1) {
    if (l && l < 33) {
        // Messagge end, do something
    }
    l = read(fd, buf, 33);
    o.append(buf, 0, l);
}

1 Ответ

0 голосов
/ 07 октября 2019

VMIN должно быть установлено на 0. Если VMIN > 0, таймер не запускается до тех пор, пока не прибудет первый символ, и вызов может блокироваться на неопределенный срок, если линия свободна.

Вы также не добавляете свой последний buf к string перед вами. "сделай что-нибудь". Это должно работать лучше:

ssize_t l = 0; // use this type with read()
char buf[33];
std::string o;

while(true) {
    // VMIN == 0, VTIME > 0:
    // This is an overall timer, not an intercharacter one, so we need to loop to
    // emulate an intercharacter timer.

    while((l = read(fd, buf, 33)) > 0)
        o.append(buf, l); // this overload doesn't construct a temporary std::string

    if(o.size()) { 
        // do something with o

        o = ""; // reset o
    }

    if(l == -1) // read error
        break;
}
...