LINUX.ORG.RU

Qt sockets


0

1

В linux программа Qt с сокетами работает как часы в виндах начинает выдавать что-то типа QNativeSocketEngine::read() was called on an uninitialized socket device это что такое?

А что говорят обычные сокеты? Они тоже кроссплатформенные. Только специфично для винды нужно инициализацию написать

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

Обычные не пробывал, нужно запинать Qt only

mskmsk1985
() автор топика

какие ты классы юзаешь для сокетов? юзал Qt-шные сокеты и под виндой и под Linux, вообще нет никаких проблем

может кусочек кода покажешь?

ты про TCP/UDP, я не ошибаюсь?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

В конструкторе класса дочернего от QThread:

	m_socket = new QUdpSocket(this);
	m_socket->bind();
	m_socket->connectToHost(addr, 13000);

В главном цикле потока

	if ( !m_socket->waitForConnected() )
		return;

...

	for (;;)
	{
		/* Read incoming packet if available. */
		if ( m_socket->bytesAvailable() >= 2720 )
		{
			QByteArray data;
			unsigned length = 2720;
			while ( length )
			{
				QByteArray d = m_socket->read(length);
				length -= d.size();
				data += d;
			}
.....
                }
         }
.......

как-то так. Чего я инетерсно забыл?

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

> while ( length )

Как-то это не круто. А что если read вернет больше 2720 (судя по условию с bytesAvailable это возможно) и length в итоге будет «отрицательным» (я вижу, что оно unsigned, но вы меня поняли)?

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

Но все равно это while условие странное.
Предположим read всегда считает ровно length, тогда while лишний.
Предположим read может считать меньше в первый раз, он считывает, скажем, n байт в первый заход, где 0 < n < length, а во второй заход считывает m такое, что m + n > length (bytesAvailable это допускает), и тогда условие while ломается.

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

Я идиот, length меняется. Сегодня не мой день. =)

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

В винде куте само должно делать wsastartup.

Вообще сокеты в куте - дерьмо, мне уже как-то приходилось их выбрасывать из-за глюков и переписывать все на расовые bsd sockets.

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