Page 1 of 3 123 LastLast
Results 1 to 20 of 57

Thread: QSslSocket vs QTcpSocket problem

  1. #1
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default QSslSocket vs QTcpSocket problem

    Modified server1 code:

    Modified test server2/client code: (removed)

    I'm having trouble uploading through using SSL, a situation that in early server1 sends some 8842 bytes, and the server gives a two bytesAvaible just exactly what 4096 means that the code can not go further in the next step bytesavaible gives some 4,044 bytes, and therefore all dishes are made from the second turn, do-while loop. Previously, I managed to write a version without SSL (which is, however, I needed) and everything worked perfectly as I wanted to send no matter whether large or small files and in different quantities. Servera1 without ssl code:
    (removed)

    server2/client without SSL:
    (removed)

    I've changed in server2 signal readyRead to encrypted in connect, becouse it was my mistake, but after that I can't get out from first loop becouse bytesAvailable gives 0 bytes and I don't know. Thanks for the help in advance.
    Attached Files Attached Files
    Last edited by camol; 4th March 2011 at 17:52.

  2. #2
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    Sorry I can't find the EDIT option to edit my first post:

    Qt Code:
    1. DServer::DServer(QObject *parent) : QTcpServer(parent)
    2. {
    3. if (!listen(QHostAddress("192.168.56.1"),(quint16)55678))
    4. {
    5. QTextStream(stdout) << errorString();
    6. }
    7. }
    8. void DServer::incomingConnection(int socketDescriptor)
    9. {
    10. serverSocket = new QSslSocket(this);
    11. if (serverSocket->setSocketDescriptor(socketDescriptor))
    12. {
    13. connect(serverSocket, SIGNAL(encrypted()), this, SLOT(response_to_connection()));
    14. connect(serverSocket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(errorOccured(const QList<QSslError> &)));
    15. connect(serverSocket, SIGNAL(disconnected()), this, SLOT(clientDisconnected()));
    16. serverSocket->setProtocol(QSsl::SslV3);
    17. serverSocket->setPrivateKey("server.key");
    18. serverSocket->setLocalCertificate("server.crt");
    19. serverSocket->startServerEncryption();
    20. }
    21. else
    22. {
    23. delete serverSocket;
    24. }
    25. }
    26. void DServer::response_to_connection()
    27. {
    28. QHostAddress connected_host = serverSocket->peerAddress();
    29. if(connected_host.toString() == QString("192.168.56.101"))
    30. {
    31. response_to_replication();
    32. }
    33. }
    34. void DServer::errorOccured(const QList<QSslError> &error)
    35. {
    36. serverSocket->ignoreSslErrors();
    37. }
    38. void DServer::response_to_replication()
    39. {
    40. blockSize = 0;
    41. QByteArray block;
    42. block.clear();
    43. QDataStream out(&block, QIODevice::WriteOnly);
    44. out.setVersion(QDataStream::Qt_4_0);
    45. serverfiles.clear();
    46. serverfiles = rfilelist();
    47.  
    48. out << (quint64)0;
    49. out << (out,serverfiles);
    50. out.device()->seek(0);
    51. out << (quint64)(block.size() - sizeof(quint64));
    52.  
    53. qint64 data = serverSocket->write(block);
    54. QTextStream(stdout) <<"block.size = " <<block.size() <<endl;
    55. QTextStream(stdout) <<"data = " <<data <<endl;
    56.  
    57. serverSocket->reset();
    58.  
    59. QDataStream in(serverSocket);
    60. in.setVersion(QDataStream::Qt_4_0);
    61.  
    62. if (blockSize == 0)
    63. {
    64. do
    65. {
    66.  
    67. if(serverSocket->state() == QAbstractSocket::UnconnectedState)
    68. {
    69. return;
    70. }
    71. serverSocket->waitForReadyRead(1);
    72. }
    73. while(serverSocket->bytesAvailable() < (int)sizeof(quint64));
    74.  
    75. in >> blockSize;
    76. }
    77.  
    78. do
    79. {
    80. if(serverSocket->state() == QAbstractSocket::UnconnectedState)
    81. {
    82. return;
    83. }
    84. serverSocket->waitForReadyRead(1);
    85. }
    86. while(serverSocket->bytesAvailable() < blockSize);
    87.  
    88.  
    89. QStringList requestedFL;
    90. in >> (in,requestedFL);
    91. serverSocket->reset();
    92.  
    93. for(int h=0;h<requestedFL.count();h++)
    94. {
    95. QTextStream(stdout) << requestedFL[h] <<endl;
    96. }
    97.  
    98. if(requestedFL.isEmpty() == false)
    99. {
    100. QByteArray compressed_ba;
    101. int len_requestedFL = requestedFL.count();
    102.  
    103. for(int i=0; i<len_requestedFL; i++)
    104. {
    105. block.clear();
    106. ba.clear();
    107. compressed_ba.clear();
    108.  
    109. QFile file(*homepath + requestedFL[i]);
    110. if (!file.open(QIODevice::ReadOnly))
    111. return;
    112. ba = file.readAll();
    113.  
    114. out << (quint64)0;
    115. out << ba;
    116. out.device()->seek(0);
    117. out << (quint64)(block.size() - sizeof(quint64));
    118.  
    119. serverSocket->write(block);
    120. serverSocket->reset();
    121.  
    122. file.close();
    123. blockSize = 0;
    124. int v=0;
    125.  
    126. do
    127. {
    128. if(serverSocket->state() == QAbstractSocket::UnconnectedState)
    129. {
    130. return;
    131. }
    132. serverSocket->waitForReadyRead(1);
    133. }
    134. while((serverSocket->bytesAvailable() < (int)sizeof(quint64)) );
    135.  
    136. in >> blockSize;
    137.  
    138. QString confirmation;
    139. in >> confirmation;
    140. serverSocket->reset();
    141. }
    142. }
    143.  
    144. }
    145.  
    146. void DServer::clientDisconnected()
    147. {
    148. if (!serverSocket)
    149. return;
    150.  
    151. serverSocket->deleteLater();
    152. wtolog(QString("Client Disconnected from Server"));
    153. }
    154.  
    155. void DServer::response_to_connection()
    156. {
    157. while (hasPendingConnections())
    158. {
    159. QSslSocket *client = nextPendingConnection();
    160.  
    161. connect(client, SIGNAL(disconnected()), this, SLOT(clientDisconnected()));
    162. serverSockets.append(client);
    163.  
    164. QHostAddress connected_host = client->peerAddress();
    165. if(connected_host.toString() == QString("192.168.56.101"))
    166. {
    167. response_to_replication(client);
    168. }
    169. }
    170. }
    To copy to clipboard, switch view to plain text mode 
    server2client:
    Qt Code:
    1. Server::Server()
    2. {
    3. clientSocket = new QSslSocket(this);
    4.  
    5. clientSocket->abort();
    6. QString hostIP("192.168.56.1");
    7. quint16 hostPort = 55678;
    8. connect(clientSocket, SIGNAL(readyRead()),this, SLOT(connectionEstablished()));
    9. connect(clientSocket, SIGNAL(sslErrors(const QList<QSslError> &)),this, SLOT(errorOccured(const QList<QSslError> &)));
    10.  
    11. clientSocket->setProtocol(QSsl::SslV3);
    12. clientSocket->connectToHostEncrypted(hostIP, hostPort);
    13. }
    14.  
    15. void Server::connectionEstablished()
    16. {
    17.  
    18. QSslCertificate cert = clientSocket->peerCertificate();
    19. if(cert.isNull())
    20. {
    21. }
    22.  
    23. QSslCipher cipher;
    24. cipher = clientSocket->sessionCipher();
    25. initiate_replication();
    26. }
    27.  
    28.  
    29. void Server::initiate_replication()
    30. {
    31. QDataStream in(clientSocket);
    32. blockSize = 0;
    33. in.setVersion(QDataStream::Qt_4_0);
    34.  
    35. if (blockSize == 0)
    36. {
    37. do
    38. {
    39. clientSocket->waitForReadyRead(1);
    40. }
    41. while(clientSocket->bytesAvailable() < (int)sizeof(quint64));
    42.  
    43. in >> blockSize;
    44. }
    45.  
    46. do
    47. {
    48. clientSocket->waitForReadyRead(1);
    49. }
    50. while(clientSocket->bytesAvailable() < blockSize);
    51.  
    52. QStringList receivedFL;
    53. in >> (in,receivedFL);
    54. clientSocket->reset();
    55. QByteArray block;
    56. block.clear();
    57. QDataStream out(&block, QIODevice::WriteOnly);
    58. out.setVersion(QDataStream::Qt_4_0);
    59.  
    60. out << (quint64)0;
    61. out << (out,requestedlist);
    62. out.device()->seek(0);
    63. out << (quint64)(block.size() - sizeof(quint64));
    64.  
    65. clientSocket->write(block);
    66. clientSocket->reset();
    67.  
    68.  
    69. blockSize = 0;
    70. if (blockSize == 0)
    71. {
    72. do
    73. {
    74. clientSocket->waitForReadyRead(1);
    75. }
    76. while(clientSocket->bytesAvailable() < (int)sizeof(quint64));
    77.  
    78. in >> blockSize;
    79. }
    80.  
    81. int p=0;
    82. do
    83. {
    84. clientSocket->waitForReadyRead(1000);
    85. }
    86. while (clientSocket->bytesAvailable() < blockSize);
    87.  
    88. QByteArray compressed_ba;
    89.  
    90. ba = clientSocket->readAll();
    91. clientSocket->reset();
    92.  
    93. block.clear();
    94. out << requestedlist[j];
    95. out.device()->seek(0);
    96. out << (quint64)(block.size() - sizeof(quint64));
    97.  
    98. clientSocket->write(block);
    99. clientSocket->reset();
    100. }
    101.  
    102. clientSocket->disconnectFromHost();
    103.  
    104. }
    105.  
    106. void Server::errorOccured(const QList<QSslError> &error)
    107. {
    108. clientSocket->ignoreSslErrors();
    109.  
    110. }
    111.  
    112.  
    113. Server::~Server()
    114. {
    115. }
    To copy to clipboard, switch view to plain text mode 

  3. #3
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    What is this supposed to do?
    Qt Code:
    1. ba = clientSocket->readAll();
    2. clientSocket->reset();
    To copy to clipboard, switch view to plain text mode 

    Instead of using waitForReadyRead() you should really use signals and slots.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  4. #4
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    When I will get it to work I am going to improve the code in the estetic way but now I really must to get it work.

    This element doesn't matter at this moment as I wrote that before without SSL everything work great and like I wanted it to work but now I don't know why i teh first loop I get clientSocket->bytesAvailable = 0 in the first loop in client. The signal encrypted was emitted becouse the program went in the function initiate_replication, the server1 gives the exact amount of bytes that was written in to the socket but at the client side there is nothing to receive that is what bothers me, that why I can't move on with it. Please help.

  5. #5
    Join Date
    Oct 2010
    Location
    Belarus
    Posts
    71
    Thanks
    1
    Thanked 9 Times in 9 Posts
    Qt products
    Qt4
    Platforms
    Windows Maemo/MeeGo

    Default Re: QSslSocket vs QTcpSocket problem

    Let's try code from Secure Socket Client From QT examples. It's work nice.

    And also as Mr. Wysota say you should use signal slot mechanism, or use processEvent() in loops

  6. #6
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    But I tried to use this http://xizhizhu.blogspot.com/2010/08...unication.html
    I compiled those codes and they worked fine then I transfered the vital elements to my project and didn't get the positive result like with the original ones.

  7. #7
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    Quote Originally Posted by camol View Post
    When I will get it to work I am going to improve the code in the estetic way but now I really must to get it work.

    This element doesn't matter at this moment as I wrote that before without SSL everything work great and like I wanted it to work but now I don't know why i teh first loop I get clientSocket->bytesAvailable = 0 in the first loop in client. The signal encrypted was emitted becouse the program went in the function initiate_replication, the server1 gives the exact amount of bytes that was written in to the socket but at the client side there is nothing to receive that is what bothers me, that why I can't move on with it. Please help.
    Your problem is generally the fact that the iodevice has a limited read buffer and your block is larger than it. The approach you are using is generally incorrect, you should be reading the data into your own buffer and only then check the size of your buffer against the size of data you expect.

    Either like so:
    Qt Code:
    1. QByteArray buffer;
    2. while(buffer.size() < blockSize) {
    3. socket->waitForReadyRead();
    4. buffer.append(socket->readAll());
    5. }
    6. doSomethingWith(buffer);
    To copy to clipboard, switch view to plain text mode 

    or (better) like so:
    Qt Code:
    1. QByteArray m_buffer;
    2.  
    3. void X::onSocketReadyRead(){
    4. m_buffer.append(socket->readAll());
    5. while(m_buffer.size()>=blockSize) processData();
    6. }
    To copy to clipboard, switch view to plain text mode 
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  8. #8
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    I am very greatfull for your help and interest I will give it a try and change my aproach to the problem. Hope it will work, I will response with the results.

    EDIT:
    But still I have a question why this mechanism which I used in those attachments with "normal" in name works, becouse you wrote that is bad approach but those"normal" verions of my codes work as they should???
    Last edited by camol; 5th March 2011 at 18:37.

  9. #9
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    Hmm but i think that I do exactly the same you wrote just in a bit diffrent way but idea is the same, firstly the server writes to the socket using QDataStream out, which uses the QByteArray block. Data is written to the block and the the size of the this block is being put at the beginning of the QDataStream. Then at the client side the first do-while loop waits for "the size" of the expected data(for example: files) the size of "the size" is known thats why this is in the first while: clientSocket->bytesAvailable() < (int)sizeof(quint64). After I get the size of the expected incoming data(for example file) thanks to the blockSize now I can wait for my exact data using second do-while loop, and that is why I am using this: clientSocket->bytesAvailable() < blockSize. This is the mechanism that I'm using here and it really worked great, even in sending 10 MB in one file, and as I remember I've used the example from Qt examples and modified it (mostly changed If-instructions to do-while to get to work with big files). After adding SSL something went wrong and it's strange, becouse I read that I can use QSslSockets like QTcpSockets after reimplementing incomingconnection signal. I think that whole handshake stuff is ok becouse I've checked states of both socket server and client side and they were in right state and were encrypted.

  10. #10
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    Quote Originally Posted by camol View Post
    Hmm but i think that I do exactly the same you wrote just in a bit diffrent way but idea is the same, firstly the server writes to the socket using QDataStream out, which uses the QByteArray block. Data is written to the block and the the size of the this block is being put at the beginning of the QDataStream. Then at the client side the first do-while loop waits for "the size" of the expected data(for example: files) the size of "the size" is known thats why this is in the first while: clientSocket->bytesAvailable() < (int)sizeof(quint64). After I get the size of the expected incoming data(for example file) thanks to the blockSize now I can wait for my exact data using second do-while loop, and that is why I am using this: clientSocket->bytesAvailable() < blockSize. This is the mechanism that I'm using here and it really worked great, even in sending 10 MB in one file, and as I remember I've used the example from Qt examples and modified it (mostly changed If-instructions to do-while to get to work with big files). After adding SSL something went wrong and it's strange, becouse I read that I can use QSslSockets like QTcpSockets after reimplementing incomingconnection signal. I think that whole handshake stuff is ok becouse I've checked states of both socket server and client side and they were in right state and were encrypted.
    This mechanism is invalid in a general case. Buffers are limited and when they are full, data stops coming in and you'll never reach your desired block count. With plain TCP socket it worked because it had a larger buffer than the SSL socket that apparently has it set at 4kB. Again, this approach is INVALID. I know it has been used in many places in people's code and I think it originates from one of Qt books but it doesn't change the fact that it is invalid and also makes your application prone to DOS attacks.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  11. #11
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    But still there is one "?" for me becouse I can't get even 20bytes through this socket. The server writes 20bytes(return value of byteswritten) to the socket,it's a test QString message, but I still can't get anything at the client side. The capacity of the SslSocket is so small the? I need to get those first bytes of the socket to be aware of expected amount of date and use your code aproach.

  12. #12
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    Is encryption successfully established?
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  13. #13
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    Yes I've checked at both sides isEncrypted and I get true for them.

  14. #14
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    And communication works one way or you can't read any data on both ends?
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  15. #15
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    I haven't checked this way client->server yet, becouse my idea was this way first server->client. I've also checked the return value at server side of bytesWritten(sth. like that) was the same as block.size, so I it looks like the data were written to the using socket but the client doesn't receive anything.

  16. #16
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    How do you check that you receive no data?
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  17. #17
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    I use socket->bytesAvailable I get 0 all the time. Now ,as I sad, I try to send small amount of date(test QString) that has about 20bytes so I think it shouldn't be too much, but still I'm at the same point when I was trying to send the exact date before.

  18. #18
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    Quote Originally Posted by camol View Post
    I use socket->bytesAvailable I get 0 all the time.
    Ok, but WHEN do you do that?
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


  19. #19
    Join Date
    Mar 2011
    Posts
    53
    Thanks
    2
    Qt products
    Qt4
    Platforms
    Unix/X11 Windows

    Default Re: QSslSocket vs QTcpSocket problem

    Here
    Qt Code:
    1. void Server::initiate_replication()
    2. {
    3. QDataStream in(clientSocket);
    4. blockSize = 0;
    5. in.setVersion(QDataStream::Qt_4_0);
    6.  
    7. if (blockSize == 0)
    8. {
    9. do
    10. {
    11. qDebug << clientSocket->bytesAvailable();
    12. clientSocket->waitForReadyRead(1);
    13. }
    14. while(clientSocket->bytesAvailable() < (int)sizeof(quint64));
    15.  
    16. in >> blockSize;
    17. }
    To copy to clipboard, switch view to plain text mode 
    after the signal encrypted is emitted.
    Last edited by camol; 7th March 2011 at 15:41.

  20. #20
    Join Date
    Jan 2006
    Location
    Warsaw, Poland
    Posts
    33,364
    Thanks
    3
    Thanked 5,013 Times in 4,791 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows Android Maemo/MeeGo
    Wiki edits
    10

    Default Re: QSslSocket vs QTcpSocket problem

    I'd say that's way too early. Anyway I suggest you rewrite your code to use signals and slots. You wouldn't have any of those problems then.
    Your biological and technological distinctiveness will be added to our own. Resistance is futile.

    Please ask Qt related questions on the forum and not using private messages or visitor messages.


Similar Threads

  1. problem with QTcpSocket
    By Fallen_ in forum Qt Programming
    Replies: 10
    Last Post: 28th November 2010, 12:03
  2. QSslSocket - problem with connecting to the server
    By kremuwa in forum Qt Programming
    Replies: 9
    Last Post: 26th August 2010, 15:40
  3. Problem in QTcpSocket
    By navi1084 in forum Qt Programming
    Replies: 2
    Last Post: 16th October 2008, 13:12
  4. QSslSocket problem
    By The Storm in forum Qt Programming
    Replies: 5
    Last Post: 23rd March 2008, 13:58
  5. problem with QTcpSocket
    By SuperSonik in forum Qt Programming
    Replies: 8
    Last Post: 31st January 2007, 17:00

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.