PDA

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.