• 6608阅读
  • 2回复

QTcpServer与标准socket之间的通信! [复制链接]

上一主题 下一主题
离线dxwang
 

只看楼主 倒序阅读 楼主  发表于: 2007-07-18
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
请问谁做过qt的QTcpServer(linux系统) 与 标准的socket通信(windows系统)啊。 我connect,qt就是不发出newConnection消息,从接受不了连接。 导致标准socket的connect发生错误! 不知道是不是不能这样用.
代码如下:
windows 客户端代码为:(windows)


CODE:[Copy to clipboard]    try
    {
        ssConnect.Create();
        ssConnect.Connect(sbServer);
        ssConnect.Write(strTransHead1,50,10);
        ssConnect.Write(DataBuf,uiFileLen,100);
    }
    catch (CBlockSocketException* pe)
    {
        AfxMessageBox(pe->m_strMessage);
        pe->Delete();
        AfxMessageBox("传输失败");
    }   
    ssConnect.Close();
    AfxMessageBox("传输完毕");
服务器端的代码(linux):


CODE:[Copy to clipboard]tcpPowerServer = new QTcpServer(this);
if (!tcpPowerServer->listen(QHostAddress("192.168.1.3"),12338)) {
        QMessageBox::critical(this, tr("Pluse Power Web Server"),
                              tr("Unable to start the Pluse power Web server!")
                            );
        close();
        return;
    }
connect(tcpPowerServer, SIGNAL(newConnection()), this, SLOT(receivePulsePowerWebData()));
void MainDialog::receivePulsePowerWebData()//12338
{
    StatusContext->setText("begin to receive connection for power");
    QString strHeadInfo,strData;
    QString DataLen, strFileName;
    int uiDataLen;
    float ReceivePowerData[5];
    if(!bStartServer) return;
    QTcpSocket *clientConnection = tcpPowerServer->nextPendingConnection();
    QDataStream in(clientConnection);
    in.setVersion(QDataStream::Qt_4_0);
    StatusContext->setText("begin to receive power");
    if (clientConnection->bytesAvailable() < 50)
    {     
          StatusContext->setText("Recieve Power Head is Less Than 50!");
          clientConnection->disconnectFromHost();
          if(clientConnection!=NULL)delete clientConnection;
          return;
    }
    in >> strHeadInfo;
    if(Parse(strHeadInfo,strFileName,DataLen))
    {
        uiDataLen=DataLen.toInt();
    if (clientConnection->bytesAvailable() < uiDataLen)
        {  StatusContext->setText("Recieve Power Content is less than uiDatalen!");
            clientConnection->disconnectFromHost();
            if(clientConnection!=NULL)delete clientConnection;
            return;
        }
      in >> strData;
        for(int i=0;i<5;i++)
     ReceivePowerData=0.0;
        QStringList liststrData = strData.split(",");
        if(5!=liststrData.size())
          {
              StatusContext->setText("Power Data is less than 5!");
              clientConnection->disconnectFromHost();
             if(clientConnection!=NULL)delete clientConnection;
              return;
          }
        QString arraystrData[5];
        for(int i=0;i<5;i++)
          {
        arraystrData=liststrData.takeAt(i);
       }   
        ReceivePowerData[0]=arraystrData[0].toInt();
        ReceivePowerData[1]=arraystrData[1].toFloat();
    ReceivePowerData[2]=arraystrData[2].toInt();
    ReceivePowerData[3]=arraystrData[3].toFloat();
    ReceivePowerData[4]=arraystrData[4].toFloat();
    clientConnection->disconnectFromHost();
        if(clientConnection!=NULL)delete clientConnection;
      StatusContext->setText("receive  power  success");
        QMutexLocker locker(&mutex); 
        mutex.lock();
    QSqlQuery query;
        query.exec("SELECT * FROM record1 where ShotNo=ReceivePowerData[0]");
        if(query.next())
    {
        query.prepare("update record1 set AvePower = ?,PowerTLength=?,MaxInPower=?,MaxOutPower=? where ShotNo = ?");
        query.addBindValue(ReceivePowerData[1]);
        query.addBindValue(ReceivePowerData[2]);
    query.addBindValue(ReceivePowerData[3]);
    query.addBindValue(ReceivePowerData[4]);
    query.addBindValue(ReceivePowerData[0]);
        query.exec();
      }else
    {
      query.exec(QString("insert into record1(ShotNo,AvePower,PowerTLength,MaxInPower,MaxOutPower) values(ReceivePowerData[0],ReceivePowerData[1],ReceivePowerData[2],ReceivePowerData[3],ReceivePowerData[4])"));
    }
        mutex.unlock();
    } 
}
客户端有connect请求的时候,服务器端没有执行receivePulsePowerWebData()这个函数。
下面是.h的原文
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDialog>
#include <QMessageBox>
#include "ui_maindialog.h"
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QtNetwork>

class QTcpServer;

class MainDialog : public QDialog, public Ui::lhcdwebDialog
{
        Q_OBJECT
public:
        MainDialog(QWidget *parent=0);
       ~MainDialog();
private slots:
        void on_StartButton_clicked();
        void on_StopButton_clicked();
        void on_ExitButton_clicked();
        void receivePulsePowerWebData();
        void receivePulsePhaseWebData();
signals:
      void error(int socketError, const QString &message);
  //   void error(QTcpSocket::SocketError socketError);
private:
        QTcpServer *tcpPowerServer;
        QTcpServer *tcpPhaseServer;
        QString hostName;
        quint16 port;
        QMutex mutex;
            QWaitCondition cond;
            bool bStartServer;
     
};
#endif
[ 此贴被XChinux在2008-07-18 11:02重新编辑 ]
每天进步一点点
离线dxwang

只看该作者 1楼 发表于: 2007-07-20
顶一下,别沉了
每天进步一点点
离线dxwang

只看该作者 2楼 发表于: 2007-07-30
解决了,防火墙问题,呵呵
每天进步一点点
快速回复
限100 字节
 
上一个 下一个