Russian Qt Forum

Qt => Работа с сетью => Тема начата: BigHom от Январь 26, 2015, 11:40



Название: Обмен QTcpServer
Отправлено: BigHom от Январь 26, 2015, 11:40
QT3 создаю обмен : клиент - сервер между компьютерами, типа:
Код:
      m_ptcpServer = new QTcpServer(this);
 
      if (!m_ptcpServer->listen(QHostAddress::Any,nPorta))   {
               QMessageBox::critical(0, "server error", "Unable to start the server:"+m_ptcpServer->errorString());
                m_ptcpServer->close();                return;        }

      connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));

код обработки сигнала от клиента "новое соединение" задаю, что обрабатывать readyRead будет программа slotReadClient() - но это не важно - так как это работает , а вопрос по выдачи уже клиенту
Код:
    void slotNewConnection()
{ pClientSocket =m_ptcpServer->nextPendingConnection();
connect(pClientSocket,SIGNAL(disconnected()),   pClientSocket,SLOT(deleteLater()));
connect(pClientSocket,SIGNAL(readyRead()),   this,SLOT(slotReadClient()));
}
   

Всё работает до определённого момента,  например, выдача по 1млн. байт на 2-й выдаче массива в 1млн.байт обмен виснет. То есть программа работает, можно жать кнопки и т.д., кроме обмена по сети . Работаю под МСВС - поэтому приходится перезагружать МСВС , чтобы опять заработало - пока не достигнет выдачи по порту где-то в сумме= 1.2 млн. байт.
Вопрос: почему виснет обмен по порту ? Причём, если с клиента посылать в сумме 1200 000 байт - виснет или с сервера посылать достигнув в сумме= 1 200 000 байт также виснет.


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 26, 2015, 12:20
виснет где: не приходит slotNewConnection и/или readyRead ?

service netowrk restart - чтобы не перегружать

а зачем qt3, ведь qt4 уже есть в  мсвс ?


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 26, 2015, 12:31
Данные больше не идут ни в каком направлении и , конечно, не приходят следующие readyRead
Новые конекты не нужны, так как работаю с одним и тем же клиентом - с которым налажена связь, как раз через 1раз сработанный сигнал новыйконект.
1-й пакет на миллион байт проходит - всё нормально. Вижу как поступают сигналы на очередной кусок readyRead (сделал ловушку) , потом посылаю заново тоже самое и тут часть проходит и где-то зависает...
Повторяю заново, зависает опять на одном и том же куске...(кто-то режет мой миллион на куски и посылает куски в порт...мне без разницы пусть режет, но зачем виснуть?)
QT3 потому, что так получилось... Надо именно QT3
Схема : ноутбук(cервер) -провод- коробка -провод- ноутбук(клиент)

код выдачи:
Код:
 void toclient()
{
QString ss=1млн.байт;
if (ss.size()>0)
{   QTextStream out(pClientSocket);
                out<<ss;}
}


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 26, 2015, 13:12
и такое поведение только под мсвс (под например клиент\сервер на ubuntu все ок) ?
сниффер показывает приход пакетов когда нет readyRead ?


Название: Re: Обмен QTcpServer
Отправлено: Bepec от Январь 26, 2015, 13:20
Я думаю тут проблема в его коде, где нить ошибочка в буфере неочищаемом и капец :)
Полный код он не привёл, так что все выводы лишь предположения :)


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 26, 2015, 13:25
Я думаю тут проблема в его коде, где нить ошибочка в буфере неочищаемом и капец :)
Полный код он не привёл, так что все выводы лишь предположения :)
Как очищать буфер? Какой буфер? Буфер чего?
Я практически всё привёл. Организуется с помощью QTCPServer- у серевера и QTCPSocet у клиента по порту обмен. По сигналу организуется связь - чтобы далее обмениваться И код текста выдачи приведён.


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 26, 2015, 13:32
и такое поведение только под мсвс (под например клиент\сервер на ubuntu все ок) ?
сниффер показывает приход пакетов когда нет readyRead ?
После того как пропадают readyRead пакеты не приходят. Мои программы вообще перестают работать , даже если выйти и заново запустить. Только перезагрузка МСВС - возобновляет обмен. Сейчас изучаю sudo service networking restart  чтоб не перезагружать
Сниффер - это отдельная программа? как ей пользоваться и где взять?


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 26, 2015, 13:45
Сниффер - это отдельная программа? как ей пользоваться и где взять?

в составе мсвс должна быть
пример использования:
консоль 1: # tcpdump -n -i eth0 'host 8.8.8.8'
консоль 2: $ ping 8.8.8.8
теперь в консоле 1 видны icmp пакеты
теперь по аналогии со своим приложением

iptables-save что говорит ?


Название: Re: Обмен QTcpServer
Отправлено: Bepec от Январь 26, 2015, 13:53
Cмешная ситуация.
Перестают работать только его программы. Следовательно кто то блочит. Кто блочит? скорее всего антивир, брандмауеэр. Блочат при интенсивной передаче. Предел 1,2 мб данных неизвестно откуда присылаемых.


Сниффер покажет отсутствие пакетов. Ибо они будут отбрасываться :)

PS qate вы уже в дебри нетворка полезли, а оно нужно? Начинать надо с простого - отключить брандмауэр и антивирус, удалить нафиг программы аля macfree и microsoft antivirus :D


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 26, 2015, 14:22
service network restart - чтобы не перегружать
Точна, после выдачи данной команды на ноутбуке, который передавал большой объём информации, при перезапуске моих программ  всё опять работает.  То есть виснет из-за того кто передаёт , в моём примере передаёт сервер. Что-то непонятное считает количество байт переданных моей программой и по достижению какого то числа приблизительно 1200 000 байт дальше подвешивает порт.


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 26, 2015, 14:35
PS qate вы уже в дебри нетворка полезли, а оно нужно? Начинать надо с простого - отключить брандмауэр и антивирус, удалить нафиг программы аля macfree и microsoft antivirus :D

не венда же - какой антивирус ?


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 26, 2015, 14:36
Что-то непонятное считает количество байт переданных моей программой и по достижению какого то числа приблизительно 1200 000 байт дальше подвешивает порт.

нужен минимально рабочий пример сервера и клиента, иначе только гадать и далее


Название: Re: Обмен QTcpServer
Отправлено: Bepec от Январь 26, 2015, 14:43
Вы ещё скажите что нет :) Есть и антивирусы. Есть просто программы контроля трафика. Да и в правилах наворотить там можно такое, что не дай боже.

Тут стоит выяснить - отрубается вся сеть или отдельное приложение. Если вся - проблема ОС. Если только приложение - проблема в блокировке пакетов.

PS я иду от простого к сложному. QNAM работает без нареканий. Следовательно или код BigHom неправильный, либо настройки ос/стороння программа мешает.


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 26, 2015, 15:40
Сниффер - это отдельная программа? как ей пользоваться и где взять?

в составе мсвс должна быть
пример использования:
консоль 1: # tcpdump -n -i eth0 'host 8.8.8.8'
консоль 2: $ ping 8.8.8.8
теперь в консоле 1 видны icmp пакеты
теперь по аналогии со своим приложением

iptables-save что говорит ?

Так не получилось. Но в настройках назвал один комп как server1  - типа сервер, 2-й соответственно client2

пускаю в консолях ping server1  , потом ping client2  - вижу, что на том и другом компьютере связь есть и задержка в мсек.
Далее пускаю свои пакеты от сервера к клиенту , чтобы зависла . И снова проверяю ping
 Вижу, что пинги сами на себя проходят(то есть делаю вывод сеть работает частично на обоих компах) , а вот пинг с сервера (который выдавал) на клиент : пинги вообще не идут - висит.
А пинг на клиенте : ping server1 выдает "from client2  icmp_seg=0 Destination Host Unreachable".

То есть отрубается конкретный порт связи 2-х компьютеров, причём на компьютере который выдаёт большой объём в порт


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 26, 2015, 15:48
тогда минимальный пример необходим - без него ни к qt, ни к железу, ни к мсвс обоснованных претензий не предъявить


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 27, 2015, 12:08
Запускаю свою программу сервера. Начинаю выдавать информацию. Клиент всё принимает. Добиваюсь чтоб зависла и выдача прекратилась.
Далее не выключая своей программы , даю с консоли команду на сервере , выдававшем информацию:
Код:
service network restart
 Спустя пару секунд в клиент приходят остальные байты...которые не были дополучены.


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 27, 2015, 12:31
без минимального рабочего примера тебе никто не сможет помочь - ни тут, ни в техподдержке мсвс


Название: Re: Обмен QTcpServer
Отправлено: Bepec от Январь 27, 2015, 12:32
Это называется толочь воду в ступе.
На вопросы отвечаете не точно, расплывчато.
Вместо рекомендаций делаете свои умозаключения, не дающие никакой информации.
Игнорируете просьбу выложить код.

Это что угодно, а не заинтересованность в решении вопроса :D


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 27, 2015, 13:13
main.cpp
Код:
#include <QtGui/QApplication>
#include "myserver.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyServer server(2323);
server.show();
return app.exec();
}
Код Myserver.h
Код:
#ifndef MYSERVER_H
#define MYSERVER_H

#include <QWidget>
#include <QtGui/QMainWindow>
//#include "ui_myserver.h"
#include <QtNetwork>
#include <QtXml>

class QTcpServer;

class MyServer : public QWidget{
Q_OBJECT
private:

QTcpServer* m_ptcpServer;
QPushButton* pushButton_1;
    qint16      m_nNextBlockSize;


private:
void sendToClient(QTcpSocket* pSocket, const QString& str);
void copyf(const QString& str1,const QString& str2);

public:
MyServer(int nPort, QWidget* pwgt =0);

public slots:
virtual void slotNewConnection();
        void slotReadClient();
        void slotpushButton_1( );
};
#endif // MYSERVER_H
код Myserver.cpp
Код:
#include "myserver.h"
//#include "QTcpServer"
#include <QWidget>
#include <QtGui>
#include <QtNetwork>
#include <QMessageBox>
#include <QTextEdit>
#include <QPushButton>
//#include "ui_myserver.h"
#include <QtXml>

QTcpSocket* pClientSocket;


MyServer::MyServer(int nPort, QWidget* pwgt /*=0*/)
: QWidget(pwgt),m_nNextBlockSize(0)
{
pushButton_1 = new QPushButton(QObject::tr("data"),  this);
connect(PushButton_1,SIGNAL(clicked()),this,SLOT(slotPushButton_1()));

QGridLayout * pLArch=new QGridLayout(this);
pLArch->addWidget(pushButton_1,0,0,1,1);

    int nPorta=2323;
    m_ptcpServer = new QTcpServer(this);
    if (!m_ptcpServer->listen(QHostAddress::Any,nPorta))
        {
                QMessageBox::critical(0, "server error", "Unable to start the server:"+
                        m_ptcpServer->errorString());
                m_ptcpServer->close();
                return;
        }
    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
}

//====================================================================
void MyServer::slotpushButton_1()
{// выдача сообщения клиенту

QString ss=""; //далее считываю в ss = млн.байт
QTextStream out(pClientSocket);
out<<ss;


}
//===========================================================================
void MyServer::slotNewConnection()
{
iclientov++;
// QTcpSocket*
pClientSocket =m_ptcpServer->nextPendingConnection();
connect(pClientSocket,SIGNAL(disconnected()),
   pClientSocket,SLOT(deleteLater()));
connect(pClientSocket,SIGNAL(readyRead()),
   this,SLOT(slotReadClient()));
}

//================================== приём сообщений от клиента
void MyServer::slotReadClient()
{
        QFile file("a.xml");                    // файл приёма
    if (file.open(QIODevice::Append)){
        QByteArray arrBlock;
        QTextStream in(pClientSocket);
        QString str=in.readAll();
        arrBlock=str.toAscii () ;
        file.write(arrBlock);
        arrBlock.clear ();
        file.close();
        }

   }

В файле b.xml нужно предварительно записать редактором 1млн. байтов


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 27, 2015, 14:41
это не qt3, код не собирается
выкладывай весь проект архивом чтобы только qmake && make подать


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 27, 2015, 14:54
Да, немного ошибся, сервер написан  QT4.5.3 - а который принимает на QT3 .  Сорри, немного перепутал. Я убрал из своей программы всё лишнее, оставил только то, что касается обмена.


Название: Re: Обмен QTcpServer
Отправлено: Bepec от Январь 27, 2015, 16:17
Мне всегда нравятся такие люди. Давайте я вам дам неработающий проект, правда перед этим покромсаю там весь код, который я(да да, экспертная оценка) считаю ненужным.

Делайте тогда уж минимальный проект, выдающий ошибку. Демонстрирующий проблему. А не куцый кусок копыта от коня, которого надо лечить.


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 28, 2015, 13:05
это не qt3, код не собирается
выкладывай весь проект архивом чтобы только qmake && make подать
У меня всё собралось, чуть чуть подправил вот что получилось:

main.cpp
Код:
#include <QtGui/QApplication>
#include "ServOtl.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
        ServOtl server(2323);
server.show();
return app.exec();
}

ServOtl.h
Код:
#ifndef ServOtl_H
#define ServOtl_H

#include <QWidget>
#include <QtGui/QMainWindow>
//#include "ui_myserver.h"
#include <QtNetwork>
#include <QtXml>

class QTcpServer;
class QTcpSocket;
class QPushButton;
class QTextEdit;
class QLineEdit;

class ServOtl : public QWidget{
Q_OBJECT
private:

QTcpServer* m_ptcpServer;
        QPushButton* pushButton_1;
        QTextEdit* m_ptxtInfo;
        QLineEdit* m_ptxtInput;
    qint16      m_nNextBlockSize;
        QTextEdit* m_ptxt1;
        QTextEdit* m_ptxt2;


private:
void sendToClient(QTcpSocket* pSocket, const QString& str);
void copyf(const QString& str1,const QString& str2);

public:
        ServOtl(int nPort, QWidget* pwgt =0);

public slots:
virtual void slotNewConnection();
        void slotReadClient();
        void slotPushButton_1( );
};
#endif


ServOtl.cpp
Код:
#include "ServOtl.h"
//#include "QTcpServer"
#include <QWidget>
#include <QtGui>
#include <QtNetwork>
#include <QMessageBox>
#include <QTextEdit>
#include <QPushButton>
#include <QMessageBox>
#include <QtXml>

QTcpSocket* pClientSocket;


ServOtl::ServOtl(int nPort, QWidget* pwgt /*=0*/)
: QWidget(pwgt),m_nNextBlockSize(0)
{
    ServOtl::setGeometry(QRect(20, 20, 510, 500));
pushButton_1 = new QPushButton(QObject::tr("data"),  this);
        connect(pushButton_1,SIGNAL(clicked()),this,SLOT(slotPushButton_1()));

        m_ptxtInfo= new QTextEdit;
        m_ptxtInput=new QLineEdit;
        m_ptxt1= new QTextEdit;
        m_ptxt1->setReadOnly(true);
        m_ptxt2= new QTextEdit;
        m_ptxt2->setReadOnly(true);

        m_ptxtInfo->setReadOnly(true);

QGridLayout * pLArch=new QGridLayout(this);
        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273", 0, QApplication::UnicodeUTF8)) ),0,0,1,1);
        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\276\320\272\320\275\320\276 \320\277\321\200\320\270\320\275\321\217\321\202\321\213\321\205 \321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271", 0, QApplication::UnicodeUTF8)) ),0,1,1,1);
        pLArch->addWidget(m_ptxt1,1,0,1,1);
        pLArch->addWidget(m_ptxt2,1,1,1,1);
        pLArch->addWidget(pushButton_1,2,0,1,1);

    int nPorta=2323;
    m_ptcpServer = new QTcpServer(this);
    if (!m_ptcpServer->listen(QHostAddress::Any,nPorta))
        {
                QMessageBox::critical(0, "server error", "Unable to start the server:"+
                        m_ptcpServer->errorString());
                m_ptcpServer->close();
                return;
        }
    connect(m_ptcpServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
}

//====================================================================
        void ServOtl::slotPushButton_1()
{// выдача сообщения клиенту

        QString ss="1"; //далее считываю в ss = млн.байт
        QFile file("d.dat");                    // файл приёма
        if (file.open(QIODevice::ReadOnly)){
            QTextStream out(pClientSocket);
            ss+=file.readAll();
            out<<ss;
            file.close();
        } else{
            QMessageBox::about(this,"error","file open");
        }


}
//===========================================================================
void ServOtl::slotNewConnection()
{
// QTcpSocket*
//            QMessageBox::about(this,"new Connection","slotNewConnection");
        pClientSocket =m_ptcpServer->nextPendingConnection();
connect(pClientSocket,SIGNAL(disconnected()),
    pClientSocket,SLOT(deleteLater()));
connect(pClientSocket,SIGNAL(readyRead()),
    this,SLOT(slotReadClient()));
        QTime time=QTime::currentTime ();
        m_ptxt2->append(time.toString()+" "+ "serv << client : "+
                (QApplication::translate("MyClientClass","\321\201\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\320\265 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\276", 0, QApplication::UnicodeUTF8)));
// iclientov=1;
}

//================================== приём сообщений от клиента
void ServOtl::slotReadClient()
{
        QFile file("a.xml");                    // файл приёма
    if (file.open(QIODevice::Append)){
        QByteArray arrBlock;
        QTextStream in(pClientSocket);
        QString str=in.readAll();
        arrBlock=str.toAscii () ;
        file.write(arrBlock);
        arrBlock.clear ();
        file.close();
        QTime time;
        if(str.length()>100){str=str.left(10)+"...";}
        QString strMessage= time.toString()+" "+ "serv << client :" + str;
//                m_ptxtInfo->append(strMessage);
        m_ptxt2->append(strMessage);
        }

   }


ServOtl.pro
Код:
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += ServOtl.h
SOURCES += main.cpp ServOtl.cpp

TEMPLATE  =app
CONFIG += qt warn_on thread plugin
INCLUDEPATH  += .
LANGUAGE  = C++
QT += gui core sql xml network
В файле d.dat нужно предварительно записать редактором 1млн. байтов - файл выдачи в сеть по нажатии кнопки


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 28, 2015, 13:36
в qt3 все хеадеры с маленькой буквы, тут qt4


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 28, 2015, 14:01
ок, пусть есть сервер, ну а клиент то где ?


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 30, 2015, 11:15
ок, пусть есть сервер, ну а клиент то где ?

По аналогии с сервером программа клиента:
main.cpp
Код:
#include <QtGui/QApplication>
#include "myclient.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
        //MyClient client("LocalHost",2323);
        MyClient client("server1",2323);
client.show();
return app.exec();
}

MyClient.h:
Код:
#ifndef MYCLIENT_H
#define MYCLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include <QtGui/QMainWindow>
#include <QtNetwork>
#include <QtXml>
 

class QTextEdit;
class QLineEdit;
class QPushButton;
static int insoob=0,inmsg;

class MyClient : public QWidget
{
Q_OBJECT
private:
QTcpSocket* m_pTcpSocket;
QTextEdit* m_ptxtInfo;
QLineEdit* m_ptxtInput;
qint16 m_nNextBlockSize;

QTextEdit* m_ptxt;
QTextEdit* m_ptxt1;
QTextEdit* m_ptxt2;
QPushButton* pushButton_1;
QPushButton* pushButton_2;
QPushButton* pushButton_3;
        QPushButton* pushButton_4;
        QPushButton* pushButton_5;
        QPushButton* pushButton_6;
        QPushButton* pushButton_7;
        QPushButton* pushButton_8;
        QPushButton* pushButton_9;
        QPushButton* pushButton_10;
        QPushButton* pushButton_11;
        QPushButton* pushButton_12;
        QPushButton* pushButton_13;
        QPushButton* pushButton_14;
        QPushButton* pushButton_15;
        QPushButton* pushButton_16;

public:
MyClient(const QString& strHost, int nPort, QWidget* pwgt =0);
private slots:
void slotReadyRead();
void slotError (QAbstractSocket::SocketError);
void slotSendToServer();
void slotConnected();

};

#endif // MYCLIENT_H


MyClient.cpp
Код:
#include "myclient.h"
#include <QTcpSocket>
#include <QtGui/QMainWindow>
#include <QtNetwork>
#include <QMessageBox>
#include <QTextEdit>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QApplication>
#include <QLabel>

 int iclientov=0;
 QString sss="";

MyClient::MyClient(const QString& strHost, int nPort, QWidget* pwgt /*=0*/)
:QWidget(pwgt), m_nNextBlockSize(0)
{
QString str=QDir::currentPath();
MyClient::setGeometry(QRect(20, 20, 710, 520));
MyClient::setWindowTitle(QApplication::translate("MyClientClass", "\320\270\320\274\320\270\321\202\320\260\321\202\320\276\321\200 \320\272\320\273\320\270\320\265\320\275\321\202\320\260", 0, QApplication::UnicodeUTF8));

m_pTcpSocket=new QTcpSocket(this);
m_pTcpSocket->connectToHost(strHost, nPort);


connect(m_pTcpSocket, SIGNAL(connected()), SLOT(slotConnected()) );
connect(m_pTcpSocket, SIGNAL(readyRead()), SLOT(slotReadyRead()) );
connect(m_pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(slotError(QAbstractSocket::SocketError)) );

m_ptxtInfo= new QTextEdit;
m_ptxtInput=new QLineEdit;

m_ptxtInfo->setReadOnly(true);

QPushButton* pcmd = new QPushButton("&Send");
connect(pcmd, SIGNAL(clicked()), SLOT(slotSendToServer()));
connect(m_ptxtInput, SIGNAL(returnPressed()),this, SLOT(slotSendToServer()));

QVBoxLayout* pvbxLayout = new QVBoxLayout;
pvbxLayout-> addWidget(new QLabel("<H1>Client</H1>"));
pvbxLayout-> addWidget(m_ptxtInfo);
pvbxLayout-> addWidget(m_ptxtInput);
pvbxLayout-> addWidget(pcmd);

m_ptxt= new QTextEdit;
m_ptxt->setReadOnly(true);

m_ptxt1= new QTextEdit;
// m_ptxt1->setReadOnly(true);
m_ptxt2= new QTextEdit;
m_ptxt2->setReadOnly(true);



        QGridLayout * pLArch=new QGridLayout(this);

        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\277\321\200\320\276\321\202\320\276\320\272\320\276\320\273", 0, QApplication::UnicodeUTF8)) ),5,0,1,1);
        pLArch->addWidget (new QLabel((QApplication::translate("MyServerClass", "\320\276\320\272\320\275\320\276 \320\277\321\200\320\270\320\275\321\217\321\202\321\213\321\205 \321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271", 0, QApplication::UnicodeUTF8)) ),5,1,1,1);
        pLArch->addWidget(m_ptxt,6,0,1,1);
        pLArch->addWidget(m_ptxt2,6,1,1,1);
        pLArch->addWidget(pcmd,7,0,1,1);
}

void MyClient::slotReadyRead()
{
    QTime time;
        QString strMessage= time.toString()+" "+ "serv >> client :ReadyRead";
        m_ptxt->append(strMessage);

    QFile file("a.xml");                    // файл приёма
    if (file.open(QIODevice::Append)){

        QByteArray arrBlock;
        QTextStream in(m_pTcpSocket);
        QString str=in.readAll();
        arrBlock=str.toAscii () ;
        file.write(arrBlock);
        arrBlock.clear ();

        //QTime time;
        /*QString*/ strMessage= time.toString()+" "+ "serv >> client :" + str;
//                m_ptxtInfo->append(strMessage);
m_ptxt->append(strMessage);

                file.close();
                //otvet();
            }else {m_ptxtInfo->append("slotReadClient:no read file : a.xml");}
}

void MyClient::slotError(QAbstractSocket::SocketError err)
{
QString strError="Error: no connect";
//m_ptxtInfo->append(strError);
m_ptxt->append(strError);
}

void MyClient::slotSendToServer()
{
        QString ss="mmm";

        QFile file("d.dat");                    // файл приёма
        if (file.open(QIODevice::ReadOnly)){
            QTextStream out(m_pTcpSocket);
            ss+=file.readAll();

            out<<ss;
            file.close();
        } else{
            QMessageBox::about(this,"error","file open: d.dat");
        }
        // QTextStream out(m_pTcpSocket);
        // out<<ss;
}

void MyClient::slotConnected()
{
// m_ptxtInfo->append("Received the connected() signal");
//=======================================
QTime time=QTime::currentTime ();
m_ptxt2->append(time.toString()+" "+ "serv >> client : "+
(QApplication::translate("MyClientClass","\321\201\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\320\265 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\276", 0, QApplication::UnicodeUTF8)));
iclientov=1;
}



MyClient.pro
Код:
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
QT += qui network xml xmlpatterns

# Input
HEADERS += myclient.h
SOURCES += main.cpp myclient.cpp


Также как для сервера создать редактором файл d.dat для передачи серверу

Немного скорректировал сервер - выше подправил коды. И перед обменом между машинами в системе МСВС надо настроить сеть один как клиент , а 2-й комп настроить как сервер с названием server1


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 30, 2015, 13:26
передает данные туда и обратно, нет бага

зачем в коде есть "str.toAscii" ?

на будущее если будешь выкладывать проекты - прикрепляй их zip архивом


Название: Re: Обмен QTcpServer
Отправлено: Bepec от Январь 30, 2015, 13:32
Гениально)
Предположение моё написанное на 1 странице верно - проблема в системе. :D


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Январь 30, 2015, 14:03
передает данные туда и обратно, нет бага

зачем в коде есть "str.toAscii" ?

на будущее если будешь выкладывать проекты - прикрепляй их zip архивом

файл 2млн.байт передаёт без зависания?


Название: Re: Обмен QTcpServer
Отправлено: qate от Январь 30, 2015, 14:08
да 3 млн передал, и три раза, и в обе стороны

но я заменил "server1" на IP т.к. не имею dhcp, но это не должно оказывать влияние т.к. нужно только для коннекта



Название: Re: Обмен QTcpServer
Отправлено: Bepec от Январь 31, 2015, 17:42
Могу даже навскидку предположить, что постоянная отправка пакетов блокируется системой.
Ведь вы посылаете не кусками, вы пытаетесь запихнуть 3 млн байт практически непрерывно в пакеты.

Потому решение вам будет - разбивайте и отправляйте кусками. :D

PS % на 70 уверен что ваша проблема спокойно разрешится :) Хотя это потребует небольшого протокольчика с контролем количества кусков :)


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Февраль 02, 2015, 08:27
Разбивал на 400тыс байт - зависает на 4 -м нажатии кнопки "передать". При размере 600тыс. байт зависает на 3-й передаче. При разбивании на 48тыс. байт - зависает на 30-м нажатии кнопки "передать" - нажатие на кнопку эквивалентно разбиванию на пакеты?


Название: Re: Обмен QTcpServer
Отправлено: qate от Февраль 02, 2015, 10:54
Могу даже навскидку предположить, что постоянная отправка пакетов блокируется системой.
Ведь вы посылаете не кусками, вы пытаетесь запихнуть 3 млн байт практически непрерывно в пакеты.
Потому решение вам будет - разбивайте и отправляйте кусками. :D

в этом нет смысла ибо tcp сам это делает


Название: Re: Обмен QTcpServer
Отправлено: Bepec от Февраль 02, 2015, 11:31
Не скажите. TCP делает всё сам, но реализация TCP в каждой ОС разная.

Вот реплика BigHom о кнопке опровергает мою теорию, укладываясь в отложенные 30%.

Следовательно проблема всё же в системе. МСВС не пользовался и не особо интересовался, но тут надо смотреть на ограничения передачи :)

И да, всё же QNAM должен выдавать ошибку после 30 секунд простоя. У вас QNAM связан со слотом ошибок?

PS имеется ли в сети связующие устройства типа роутера? Есть ли у этого устройства межсетевой экран и включен ли он? Если включен, то надо попробовать повторить эксперимент с отключенным экраном и просмотреть журнал событий/блокировок.


Название: Re: Обмен QTcpServer
Отправлено: qate от Февраль 02, 2015, 11:58
Не скажите. TCP делает всё сам, но реализация TCP в каждой ОС разная.

смысл бить я вижу только один - делать прогресс для пользователя - чтобы он мог контролировать процесс
но если всего 10 мег переслать по локалке 100мбит, то  бить смысла нет - влетит за 1 сек
и да - это не проблема ТС - чтото у него не так в системах, а сниффером он пользоваться не умеет

совет ТС - поставь виртуалку - туда две МСВС - все работать должно, далее ищи различия


Название: Re: Обмен QTcpServer
Отправлено: BigHom от Февраль 04, 2015, 13:52
Поставил 2 виртуалки с МСВС - программы клиент и вервер друг друга не видят. Если пускать на одной машине , то никаких зависаний(ограничений при передаче) нет, если дать имя  server1


Название: Re: Обмен QTcpServer
Отправлено: qate от Февраль 04, 2015, 14:23
Поставил 2 виртуалки с МСВС - программы клиент и вервер друг друга не видят.

Значит сеть не настроена. Если виртуалка vmware , то надо тип сети сделать NAT, тогда машины автоматом получат IP и их можно пингануть друг другом.
В программе server1 надо заменить на IP т.к. vmware не предоставляет DNS сервер в себе.