LINUX.ORG.RU

QSocket проблема


0

0

Пытаюсь отослать через QSocket несколко сообщений, но они склеиваются вместе.

MyWidget::MyWidget()
{
    thread = new MyThread;
    server = new MyServer;
    connect(server, SIGNAL(readyRead()), this, SLOT(slotRead()));
}

void MyWidget::someOtherSlot()
{
    thread->start();
}

void MyWidget::slotRead()
{
  QCString sss;
  sss.resize(server->client()->bytesAvailable());
  server->client()->readBlock(sss.data(), server->client()->bytesAvailable());
  QString s2 = sss;
  printf("SOCKET data: %s\n", s2.ascii());
}

MyThread::MyThread(MyWidget *m) : QThread()
{
  socket = new QSocket(this);
  socket->connectToHost("localhost", m->server->port());
  connect(socket, SIGNAL(connected()), SLOT(slotConnected()));
}

void MyThread::slotConnected()
{
  connected = true;
  socket->socketDevice()->setBlocking(true);
  os = new QTextStream(socket);
}

void MyThread::run()
{
  if(!connected) return;
  
  *os << "F1";
  *os << "F2";
  *os << "F3";
}

**************************************

Получаю stdout 
"SOCKET data: F1F2F3" вместо

"SOCKET data: F1"
"SOCKET data: F2"
"SOCKET data: F3" 
anonymous

я точно незнаю, но наверно если пишеш в сокет через QTextStream значить и читать надо через QTextStream.

Sveta_F
()
Ответ на: комментарий от Sveta_F

не, это не то :( так как QTextStream работает с QIODevice, а QSocket суть и есть QIODevice, тем более это же сокеты - писать можно чем угодно и читать также, хоть через винду на MSVC++ (если сервер запущен на другой машине)

anonymous
()
Ответ на: комментарий от anonymous

ну типа фишка ещё в том, что TCP это чиста stream, если тебе нада читать по кускам то данные надо чем то разделять, например

*os << "F1\n";
*os << "F2\n";
*os << "F3\n";

тогда видимо можно заюзать QSocket::readLine()

Sveta_F
()
Ответ на: комментарий от Sveta_F

не, всё это не катит. Нужно чтобы на _каждый_ посыл данных генерировался сигнал readyRead(). иначе мне всё равно, что получит сервер - "F1F2F3" или "F1\nF2\nF3\n". Нужно, чтобы он сначала получил "F1", потом "F2", и т.д.

anonymous
()
Ответ на: комментарий от anonymous

Самый бредовый способ с услип.. Слушай что тебе светка сказала. Надо строки отделять друг от друга по \n. Потому что tcp это просто потомукданных. Ты не можешь знать какой кусок тебе придет на другой конец соединения.

OxiD ★★★★
()
Ответ на: комментарий от OxiD

ладно, сделал всё на UDP - всё работатет как надо. =)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.