我有一个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;
}
......
为什么会这样?我怎样才能解决这个问题?谢谢你的帮助!
答案 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)