Почему строка разбивается при передаче по сокету?
Очередной "я не читал мануалы, памагити" вопрос. 

Читайте Снейдер, Й. "Эффективное программирование TCP/IP".

Кратко - функции send() и recv() не гарантируют, что будет записано или прочитано столько байт, сколько вы в них передали. Нужно анализировать возвращенное этими функциями значение - если оно 0 или < 0 - что-то поломалось и нужно анализировать errorno, в противном случае, вот столько байт и передалось.
В цикле чтения сокета файл каждый раз переоткрывается на запись, удаляя ранее записанное. Открой файл перед циклом и закрой после выхода из цикла.