View Full Version : Problem in writing data to socket.
Niamita
14th March 2012, 09:02
Hi
i am writing a list of bytearray on socket as following
for(int i=0; i<array.size(); i++)
{
QByteArray byte_array = array.at(i);
socket_new->socket->write(byte_array);
socket_new->socket->waitForBytesWritten(3000);
delay();
}
in delay() function
void control_screen::delay()
{
for(int i=0; i<50000; i++)
{
for(int i=0; i<5000000; i++);
}
}
It is working fine in debuge build as i want but when i build it in release mode whole array transmit at once. there is no time interval b/w data.
Guide me.
Jonny174
14th March 2012, 11:39
Try this code:
#define MTUR 1460
#define MAX_MTUR (MTUR * 1000)
//================================================== ===============================================
int Server::owriten( char *ptr, int nbytes )
{
#ifdef UNIX
int n;
int rc;
char *p;
int nleft;
char *bf = 0;
for (nleft = nbytes; nleft > 0;)
{
if (nleft >= MAX_MTUR)
{
n = MAX_MTUR;
p = ptr;
}
else
{
bf = new char[ MAX_MTUR ];
if (!bf)
return -1;
memset( bf, 0, sizeof( bf ) );
memcpy( bf, ptr, nleft );
p = bf;
n = (nleft / MTUR + 1) * MTUR;
}
rc = writen( p, n );
if (bf)
{
delete[] bf;
bf = 0;
}
if (rc != n)
return rc;
if (nleft > MAX_MTUR)
{
ptr += n;
nleft -= MAX_MTUR;
}
else
break;
}
return nbytes;
#else
int temp = 0;
int sent = 0;
quint64 offset = 0;
for (;;)
{
if (nbytes >= MAX_MTUR)
temp = MAX_MTUR;
else
temp = nbytes;
int rc = writen( &ptr[ offset ], temp );
if (rc != temp)
return rc;
offset += rc;
sent += rc;
nbytes -= rc;
if (nbytes <= 0)
break;
}
return sent;
#endif
}
//================================================== ===============================================
int Server::writen( char *ptr, int nbytes )
{
int nleft, nwritten;
nleft = nbytes;
while (nleft > 0)
{
nwritten = socket_new->socket->write( ptr, nleft );
if (nwritten <= 0)
return nwritten; // error
nleft -= nwritten;
ptr += nwritten;
}
return nbytes - nleft;
}
//================================================== ===============================================
int Server::put_mes_bin( char *fbuf, int fbuf_len )
{
int n;
if (optimize_mtu_mru)
n = owriten( fbuf, fbuf_len );
else
n = writen( fbuf, fbuf_len );
if (n < 0)
{
qDebug("Write socket error);
exit( E_WRITE );
}
else if (n == 0)
{
qDebug("Connection closed");
exit( E_WRITE );
}
return n;
}
//================================================== ===============================================
int size = array.size();
for (register int i = 0; i < size; ++i)
{
char *byte_array = array.at(i).data();
int length = array.at(i).size();
if (put_mes_bin( byte_array, length ) != length)
qDebug("Error sending data to client");
}
mentalmushroom
15th March 2012, 10:38
Don't do the delay this way (use timer), however, I don't understand why do you need a delay here at all.
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.