我有一个通过IP套接字连接到C ++服务器(使用Qt 4.8)的Web客户端(php)。奇怪的是,如果我从网络发送任何内容(我检查的数据正确),我总是在服务器端收到“ 0100000001000000”。
怪异的,如果我在连接套接字和在Web端发送数据之间执行“ sleep(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;
}
......
为什么会这样呢?我怎样才能解决这个问题?感谢帮助!!
最终,错误出在C ++服务器端。此奇怪错误的原因是因为p_socket来自QTcpServer类,但是p_socket和QTcpServer不在同一线程中,从而产生此意外行为。
实际上,除了使用睡眠之外,更改代码还会更改服务器从p_socket读取的内容(例如,从010000 ...更改为0200000)。
解决方案:在QTcpServer中重新实现“ incommingConnection”方法,以便能够在其他线程中使用套接字。(http://qt-project.org/doc/qt-4.8/qtcpserver.html#incomingConnection)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句