Данные QTcpSocket никогда не были замечены … есть идеи?

Я пытаюсь использовать Qt с C ++ для создания базового IM-клиента для школьного сетевого проекта. Я новичок в Qt и у меня был только один семестр на C ++ (но более 4-х по программированию в целом, 2 из C, один из C ++ и один из сценариев в средах * Nix), но я чувствую, что Qt будет лучшим для меня использовать, учитывая имеющуюся у него документацию, а также сетевую и графическую поддержку. Я пытаюсь отключить основные функции сервера и клиента. Я разработал простую систему обмена сообщениями между сервером и клиентом для таких вещей, как отправка сообщения клиенту, регистрация в Интернете и отключение от сети, но прежде чем приступить к работе над проектом на более высоком уровне, я хочу убедиться, что я могу положиться на эту передачу сообщений для правильного поведения. И у меня проблемы. На данный момент у меня есть два подключенных, сервер слышит клиента, работает правильно и отправляет ответное сообщение. Затем клиент отвечает на подтверждение и отправляет имя пользователя. Сервер регистрирует имя пользователя и возвращает другое подтверждение. Моя проблема в том, что, хотя сервер думает, что он отправил подтверждение, клиент никогда не получает его.

Это слот readyRead () сервера (только через область, которую я тестировал, есть другие команды, для которых я тестирую, но я еще не начал их тестировать).

void mythread::readyRead()
{ //this will change
QMutex lock;
int flag=0;
Data dData;
QLinkedList<User>::iterator Uit;
QString::iterator it;
User temp;
QByteArray stuff = socket->readAll();
qDebug() << stuff;
QString stuffText;
stuffText.clear();
qDebug() << socketDescriptor << "Data in: " << stuff;//connect new client REG command
if (stuff == "REG\n") //client would like to register. next message should be username
{//need to add check to see if user exists
socket->write("ACK"); //this is a hard ack that tells the client that it may write to the socket and be heard by the server.
stuff.clear(); //verify that buffer is cleared.
socket->waitForReadyRead();
stuff=socket->readAll();//should have username followed by \n
stuffText = stuff; //move it to a string so that I can manually remove the \n and then add it to the users list.
stuffText.remove('\n'); //hopefully removes the \n
//now to add to the user list, completing the register process.
temp.setName(stuffText);
temp.setDescriptor(this->socketDescriptor);//temp user configured. time to add
lock.lock();
users.append(temp);
lock.unlock();
//clean up
stuff.clear();
stuffText.clear();
temp.clear();
stuff="ACK";
int ans;
socket->flush();
ans = socket->write("ACK");
if(ans==-1)
{
qDebug()<< ans << "Didn't work."; //client can send data again.
}
else qDebug()<< ans <<"wrote the ack.";     //client has been added to the list. waiting for other data.
}

Это на стороне клиента.

void socket::Connect()
{
Socket1 = new QTcpSocket;
QByteArray stuff;
Socket1->connectToHost("localhost",8060);

if(Socket1->waitForConnected(3000))
{
qDebug() << "Connected";
Socket1->write("REG\n");
Socket1->waitForBytesWritten(1000); //big times for testing
Socket1->waitForReadyRead(3000);
qDebug() << "Reading:" << Socket1->bytesAvailable();
stuff = Socket1->readAll();
qDebug() << stuff;
if(stuff=="ACK")
{
Socket1->write("Sean\n");
Socket1->waitForReadyRead(3000);
if(Socket1->bytesAvailable())
{
stuff = "this"; //to test if reading is changing value at all.
stuff = Socket1->readAll();
qDebug() << stuff;
if(stuff=="ACK")
{
qDebug() << "got second ack"; //good
}
}
else qDebug() << "Didn't get anything.";
}
else Socket1->close();

Socket1->close();

}
else
{
qDebug() <<"Not connected!";
}

}

Я знаю, что здесь много кода, и если бы у меня была идея, как его сузить, я бы это сделал. Я работаю над решением этой проблемы около 3 ночей, и это действительно расстраивает. Я даже пошел на такие меры, как отключение брандмауэров и запуск сервера на одном компьютере и запуск клиента на другом.

Для дополнительной информации у меня есть захваты Wireshark, чтобы помочь.

С сервера (сервер .116). http://i47.tinypic.com/2u9k3t1.jpg

От клиента (клиент .100) http://i49.tinypic.com/2yv9nar.jpg

Я не вижу никакой разницы от других. Кажется, они имеют одинаковые пакеты в правильном порядке.

Спасибо за любую помощь.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]