2012-03-15 15 views
6

मेरे पास दो क्यूटी ऐप्स हैं। एक ऐप को एक बड़ा डेटा रखने के लिए माना जा सकता है और यह हर दूसरे दूसरे एप्लिकेशन में लगभग 10 केबी डेटा खंड भेजता है।QTcpSocket कभी-कभी डेटा नहीं भेजता

इससे पहले मैंने डेटा संचारित करने के लिए QUDPSocket का उपयोग करने की कोशिश की लेकिन एमटीयू की लगभग 2-5K की सीमा के कारण और डेटा को विभाजित करने और फिर से जोड़ने की आवश्यकता है, मैंने QTcpSocket पर स्विच किया।

कभी-कभी डेटा QTcpSocket के साथ सही ढंग से भेजा जाता है (विशेष रूप से यदि मैं डेटा को हर बार ~ हर 100 एमएस लिखता हूं) लेकिन कभी-कभी डेटा बिल्कुल नहीं भेजा जाता है। 5 सेकंड के बाद भी नहीं। और कभी-कभी कई डेटा भाग आंतरिक रूप से लंबी अवधि (कई सेकंड) के लिए buffered होते हैं और फिर एक साथ भेजा जाता है।

m_socket = new QTcpSocket(this); 
m_socket->connectToHost(QHostAddress::LocalHost, 45454); 

sendDataEverySec() 
{ 
    QByteArray datagram(10000, 'a'); 
    qint64 len = m_socket->write(datagram); 
    if(len != datagram.size()) 
      qDebug() << "Error"; //this NEVER occurs in MY case. 
    m_socket->flush(); 
} 

रिसीवर पक्ष पर, मैं readyRead सिग्नल का उपयोग पता करने के लिए जब डेटा आ गया है।

मैं कैसे सुनिश्चित कर सकता हूं कि डेटा तुरंत भेजा जाए? क्या मैं जो करने की कोशिश कर रहा हूं उसके लिए कोई बेहतर विकल्प है?

संपादित करें :: जब मैं 1 सेकंड के लंबे अंतराल के बाद लिख रहा हूं, तो मुझे प्रत्येक बार प्रेषक डेटा भेजने पर रिसीवर पक्ष पर "QAbstractSocket::SocketTimeoutError" प्राप्त होता है। अगर प्रेषक अक्सर डेटा लिखता है तो यह त्रुटि प्राप्त नहीं होती है।
क्या डेटा ठीक स्ट्रीम करने के लिए QTcpSocket का उपयोग करना ठीक है ????

संपादित 2: रिसीवर पक्ष पर, जब readyRead सिग्नल उत्सर्जित होता है, तो मैं फिर से while(m_socket->waitForReadyRead(500)) की जांच कर रहा था और मुझे "QAbstractSocket::SocketTimeoutError" मिल रहा था। इसके अलावा, यह चेक एकल हिस्सों को वितरित करने से रोक रही थी।
दस्तावेज़ों के माध्यम से जाने के बाद, ऐसा लगता है कि नया डेटा उपलब्ध होने पर readyRead लगातार उत्सर्जित किया जाएगा, इसलिए waitForReadyRead की आवश्यकता नहीं है।
मुझे सभी डेटा भेजा जा रहा है लेकिन अभी भी डेटा तुरंत नहीं आ रहा है। कभी-कभी दो-तीन भाग मर्ज किए जाते हैं। डेटा पढ़ने आदि में रिसीवर पक्ष पर देरी की वजह से यह

+0

क्या आप सेट सॉकेटऑप्शन एपीआई में QAbstractSocket :: LowDelayOption ध्वज सेट करने का प्रयास कर सकते हैं? – Kunal

+0

@ कुनल, मैंने बिना किसी सफलता के LowDelayOption और KeepAliveOption दोनों की कोशिश की।दिलचस्प है जैसे प्रेषक डेटा भेजता है, रिसीवर एक "QAbstractSocket :: सॉकेटटाइमआउट त्रुटि" दिखाता है। यह 1 सेकंड के अंतराल पर डेटा लिखने पर होता है। –

+0

मुझे विश्वास है कि समस्या प्राप्त करने वाले पक्ष में निहित है। कृपया हमें दिखाएं कि आप आने वाले कनेक्शन कैसे संभालेंगे। – Koying

उत्तर

2

रिसीवर पक्ष पर, जब readyRead संकेत उत्सर्जित होता है, मैं फिर से while(m_socket->waitForReadyRead(500)) जाँच रहा था और मैं इस की वजह से "QAbstractSocket::SocketTimeoutError" हो रही थी। इसके अलावा, यह चेक एकल हिस्सों को वितरित करने से रोक रही थी।

दस्तावेज़ों के माध्यम से जाने के बाद, यह तैयार लगता है नया डेटा उपलब्ध होने पर लगातार उत्सर्जित किया जाएगा, इसलिए waitForReadyRead की आवश्यकता नहीं है। उसने मेरी समस्या हल की थी।

0

क्लाइंट सर्वर ऐप के लिए मेरा टिपिकल समाधान है।

सर्वर साइड पर

:

class Server: public QTcpServer { 

public: 
    Server(QObject *parent = 0); 
    ~Server(); 
private slots: 
    void readyRead(); 
    void disconnected(); 
protected: 
    void incomingConnection(int); 

}; 
सीपीपी पर

:

void Server::incomingConnection(int socketfd) { 

    QTcpSocket *client = new QTcpSocket(this); 
    client->setSocketDescriptor(socketfd); 


    connect(client, SIGNAL(readyRead()), this, SLOT(readyRead())); 
    connect(client, SIGNAL(disconnected()), this, SLOT(disconnected())); 
} 

void Server::disconnected() { 
    QTcpSocket *client = (QTcpSocket*) sender(); 

    qDebug() << " INFO : " << QDateTime::currentDateTime() 
      << " : CLIENT DISCONNECTED " << client->peerAddress().toString(); 
} 

void Server::readyRead() { 
    QTcpSocket *client = (QTcpSocket*) sender(); 

    while (client->canReadLine()) { 
       //here i needed a string.. 
     QString line = QString::fromUtf8(client->readLine()).trimmed(); 
    } 
} 

क्लाइंट पर:

वर्ग ग्राहक: सार्वजनिक QTcpSocket {

public: 
    Client(const QHostAddress&, int, QObject* = 0); 
    ~Client(); 
    void Client::sendMessage(const QString&); 
private slots: 
    void readyRead(); 
    void connected(); 
public slots: 
    void doConnect(); 
}; 
सीपीपी पर

:

void Client::readyRead() { 

    // if you need to read the answer of server.. 
    while (this->canReadLine()) { 
    } 
} 

void Client::doConnect() { 
    this->connectToHost(ip_, port_); 
    qDebug() << " INFO : " << QDateTime::currentDateTime() 
      << " : CONNESSIONE..."; 
} 

void Client::connected() { 
    qDebug() << " INFO : " << QDateTime::currentDateTime() << " : CONNESSO a " 
      << ip_ << " e PORTA " << port_; 
    //do stuff if you need 
} 


void Client::sendMessage(const QString& message) { 
    this->write(message.toUtf8()); 
    this->write("\n"); //every message ends with a new line 
} 
संबंधित मुद्दे