В общем, ситуация такова:
У вас вместо устройства в QDataStream передается QByteArray (внутри он оборачивается в QBuffer, ибо сам QByteArray не является наследником от QIODevice -- http://qt-project.org/doc/qt-4.8/qdatastream.html#QDataStream-4)
Далее вы перепрыгиваете 16 бит, записывая туда нули, а затем строку (sendStream << quint16(0) << str;)
Следующий шаг вы обращаетесь к вашему устройству, которым на самом деле является QByteArray, завернутый в QBuffer, и т.к. он поддерживает доступ к случайным битам, переходите на его нулевой адрес - самое начало вашего массива байт (туда, где ваш курсор находился до записи первых 16 бит и строки).
Затем вы вычисляет размер записанной в массив строки (block.size() - sizeof(quint16) -- общий размер записанных данных - 16 бит) и записываете его на место тех первых 16 бит, которые в начале нулями заполнили.
Отправляете все это дело по tcp...
Если схематично описать все действия, то будет примерно так:
Инициализировал наш массив -- []
Записали 16 бит с нулем и строку -- [00|str]
^
при этом наш курсор оказался в конце массива, а мы хотим передвинуть его в начало
Для этого делаем device().seek(0) -- [00|str]
^
И уже за тем записываем на месте первых 16 бит, которые мы отступили в начале размер всего нашего массива [00|str] минус размер переменной этих 16 бит [0.. т.е. размер всех данных после этих 16 бит -- ..str]
Тем самым в сеть утечет размер строки и сама строка.
Мне не очень ясно, почему вы так это дело организовали, но если вам так хочется...