Mały problem z QTcpSocket

0

Witajcie.
Właśnie piszę serwer w Qt i napotkałem mały problem:
Załóżmy, że mam tablice klas. Każda klasa z tej tablicy składa się z QTcpSocket oraz 1 zmiennej typu QString, ale to mało istotne.I teraz chciałbym, aby każdy element z tej tablicy był przeznaczona dla 1 clienta, gdyż serwer będzie obsługiwał wiele clientów. Tu jest kod, które pokazuję co udało już mi się zrobić:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    server = new QTcpServer(this);
    id = 0;
    server->listen(QHostAddress::Any,666);
    connect(server,SIGNAL(newConnection()),this,SLOT(addClient()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::addClient()
{
    id++;
    user[id].socket = server->nextPendingConnection();
    user[id].ip = user[id].socket->peerAddress().toString();
    connect(user[id].socket,SIGNAL(readyRead()),this,SLOT(Read()));
}

void MainWindow::Read()
{

}

Każdy client, który nawiąże połączenie z serwerem dostanie swoją klasę 'user', w której w skład wchodzi socket i zmienna na ip. Następnie jest wywoływana funkcja connect(user[id].socket,SIGNAL(readyRead()),this,SLOT(Read())), która mniej więcej sprawdza czy dany client wysłał jakiś pakiet.
Przejdźmy teraz do sedna mego problemu:
Kiedy jakiś client wyśle pakiet na serwer, to zostanie wywołany slot Read(), lecz niestety nie będzie wiadomo który konkretnie client go wysłał.
Ktoś ma jakiś pomysł, aby w slocie Read() było wiadomo, który konkretnie socket wysłał pakiet?
Z góry dziękuje za pomoc.
Hehe, wygląda na to, że się trochę rozpisałem. Mam nadzieje, że wam to nie przeszkadza. :)

0

Hmm...
Próbowałem zrobić coś takiego:
connect(user[id].socket,SIGNAL(readyRead()),this,SLOT(user[id].Read()));
Ale chyba Qt nie akceptuję takich 'wynalazków', więc to odpada.

0

Hmm...
Ale za bardzo nie wiem jak to bym miał wykorzystać. Mógłbyś napisać bardziej co mam zrobić?

0

Może stwórz slot w tej swojej klasie i połącz go z sygnałem readyRead(), wtedy dana klasa będzie wiedziała że jest obsługuje klienta ?

0

Hehe, właśnie przed chwilą tak zrobiłem:

void User::listen()
{
    connect(socket,SIGNAL(readyRead()),this,SLOT(Read()));
}

void User::Read()
{
    qDebug("asdasd");
}

Slot Read działa jak należy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1