C ++ IP Server Socket始终接收" 0100000001000000"来自PHP套接字客户端

时间:2014-06-19 11:10:05

标签: php c++ qt sockets qt4.8

我有一个Web客户端(php),它通过IP套接字连接到C ++服务器(使用Qt 4.8)。奇怪的是,如果我从网上发送任何内容(我检查数据是正确的),我总是在服务器端收到“0100000001000000”。

Weirder,如果我在连接套接字和在网络侧发送数据之间“睡眠(1)”,大多数时候数据在服务器端是正确的。下面我附上相关代码:

PHP方(客户端):

    ....
    $socket = socket_create(AF_INET, SOCK_STREAM, /*SOL_TCP*/0);

    if(!$socket) 
        return false;

    //EscribirTrama writes $data
    $this->EscribirTrama($data, $peticion);
    $exito = true;

    if(!socket_connect($socket , gethostbyname($this->direccion) , $this->puerto))
    {
        $error = socket_strerror(socket_last_error());
        return false;
    }

    //FIXME this sleep resolves the problem most of the time, why?!
    sleep(1);

    if(!socket_send ($socket, $data, strlen($data), 0))
    {
        $error = socket_strerror(socket_last_error());
        $exito = false;
    }

    socket_close($socket);

C ++端(服务器,使用QTcpSocket)

    ....
    if(!p_socket->waitForReadyRead())
        return false;
    received_bytes = 0;

    if(p_socket->bytesAvailable() < START_SIZE)
    {
        Log.AVISO("Insuficientes datos en el socket");
        return false;
    }

    QByteArray start_bytes = p_socket->read(START_SIZE);

    received_bytes += TAM_COMIENZO;

    quint8 head = start_bytes.at(0);

    if(head != START_CHAR) //this happens when not using sleep at client side!
    {
        //bad data
        QByteArray bad_data;

        bad_data.append(head);

        while(p_socket->bytesAvailable() ||
          p_socket->waitForReadyRead(MS_PARTIAL_READ))
        {
            QByteArray bad = p_socket->readAll();

            received_bytes += bad.size();
            bad_data.append(bad);
        }

        //At this point bad_data is always "0100000001000000"!
        Log.ERROR("Se ha recibido una trama sin cabacera: " +
            CFunciones::Cadena(bad_data));

        return false;
    }
    ......

为什么会这样?我怎样才能解决这个问题?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

最后,错误发生在C ++服务器端。出现这种奇怪错误的原因是因为p_socket来自QTcpServer类,但 p_socket和QTcpServer不在同一个线程中会产生这种意外行为。

实际上,除了使用sleep之外,更改代码还会更改服务器从p_socket读取的内容(例如,从010000更改为0200000)

解决方案:在QTcpServer中重新实现“incommingConnection”方法,以便能够在其他线程中使用套接字。 (http://qt-project.org/doc/qt-4.8/qtcpserver.html#incomingConnection