вот код отправки:
int writeToClient (int fd, int n, char *data ) {
int nbytes;
long int hton_n = htonl( n );
CLog::SLogDate( "commFunc", "%d", n );
nbytes = write( fd, &hton_n, sizeof( int ) );
CLog::SLogDate( "commFunc", "%ld", hton_n );
if( nbytes < 0 ) {
fprintf( stderr, "Write: error writing to %d(fd) %d(int)\n", fd, n );
return -1;
}
if (nbytes > 0) {
#ifdef _SENDTHREAD
printf("percent out\n");
#endif
}
nbytes = write( fd, data, sizeof( char ) * n );
if( nbytes < 0 ) {
fprintf( stderr, "Write: error writing to %d(fd) %s(data)\n", fd, data );
return -2;
}
CLog::LogDate( "commFunc", data );
return 0;
}
Что отправляется:
Sat Mar 27 17:57:12 2010 commFunc 27
Sat Mar 27 17:57:12 2010 commFunc 452984832
Sat Mar 27 17:57:12 2010 commFunc <answer><id>0</id></answer>
Т.е. размер данных 27 байт, это число мы представили в стандартном для передачи по сети виде (htonl) - 452984832. Следующим пакетом будем пересылать "<answer><id>0</id></answer>" - 27 байт. Итого уехало клиенту - 31.
Что происходит на стороне клиента:
int bytes = CClientGui::tcpSocket.bytesAvailable();
fprintf( stdout, "available %d bytes\n", (int)bytes );
fprintf( stdout, "before read buf: %s\n", responseArr.data() );
responseArr.append( CClientGui::tcpSocket.readAll() );
// вызываем функцию (здесь responseArr = bufAll)
strcpy( buf, bufAll.left( sizeof( int ) ).data() );
fprintf( stdout, "input read: %s\n", buf );
fprintf( stdout, "input read (hex): %s\n", bufAll.left( sizeof( int ) ).toHex().data() );
Что приехало:
available 31 bytes
before read buf: //здесь пусто
input read: //здесь пусто
input read (hex): 00 00 00 1b 3c 61 6e 73 77 65 72 3e 3c 69 64 3e 30 3c 2f 69 64 3e 3c 2f 61 6e 73 77 65 72 3e
"3c 61 6e 73 77 65 72 3e 3c 69 64 3e 30 3c 2f 69 64 3e 3c 2f 61 6e 73 77 65 72 3e" = "<answer><id>0</id></answer>" (проверить можно здесь:
hex to string)
осталось разобраться с 00 00 00 1b
делаем так:
memcpy( &nSize, bufAll.left( sizeof( int )).data(), sizeof( int ) );
действительно nSize = 452984832
Даже htonl не надо делать, пока все писал, вот и разобрался.
Отдельное спасибо Litkevich Yuriy (memcpy выручило).