Вот сталкиваюсь с такой проблемой: нужно отправить строку клиенту (или серверу, не важно), затем отправить следующу, т.е. соблюдать порядок. Когда я делаю так:
Сокет - вещь потоковая и если хочешь, чтобы он не отправлял строки в пакете слитно, разделяй их сам (например chr(0)). Как программно вызвать конец пакета, я не знаю, но, наверно, можно закрыть, а потом снова открыть сокет.
По моему, проблемка в буфере приема при юзании recv. Дело в том, что данные приходят практически одновременно, и recv читает уже всех их из сокета (на сервере). Выходит, вы не там баг ищите, нужно в сервере искать. Проблема не решена, я не могу её решить тоже. Кстати, истинность моего мнения доказывает то, что когда кучу раз отсылать таким способом, то все же приходит время, когда строки приходят в первоначальном виде (типа, розрыв пакета).
Дело в том, что протокол TCP гарантирует доставление данных и сохранение их последовательности, но НЕ ГАРАНТИРУЕТ сохранение целостности пакетов...
Вот UDP гарантирует, что пакеты не сольются... НО не гарантирует доставку данных и сохранение последовательности пакетов...
Если пишешь, используюя UDP, надо передавать номер пакета самостоятельно и при приеме проверять последовательность пакетов, если пакет не дошел - запросить его снова...
При программировании TCP просто надо использовать разделители, например, как это сделано в pop3 и smtp, в конце каждого блока данных стоит CRLF... А сервер при приеме данных все скапливает в буфер и потом разбивает данные на определенные куски...