#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");
}
#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");
}
To copy to clipboard, switch view to plain text mode
Bookmarks