#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>
unsigned int func(int sock, int server)
{
unsigned int num; /* assume int is 32-bits */
if (server)
{
/* Server side */
num = 0x17;
/* Endianness of server host may not match endianness of network. */
if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num))
{
/* Handle error */
}
return 0;
}
else {
/* Endianness of client host may not match endianness of network. */
if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num))
{
/* Handle error */
}
/* Comparison may be inaccurate */
if (num> 255)
{
return 255;
}
else
{
return num;
}
}
}
В этом примере переменная num
присвоена шестнадцатеричное значение 0x17
и отправляется по сети клиенту с сервера. Если хост сервера является прямым порядком байтов, и сеть является обратным порядком байтов, num
передается как 0x17000000
. Клиент затем читает неправильное значение для num
и сравнивает его с локальным числовым значением.
Исправление — использует функцию порядка байтов
Прежде, чем отправить num
от хоста сервера, используйте htonl()
, чтобы преобразовать от хоста до сетевого порядка байтов. Точно так же прежде, чем считать num
на хосте клиента, используйте ntohl()
, чтобы преобразовать от сети, чтобы разместить порядок байтов.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>
unsigned int func(int sock, int server)
{
unsigned int num; /* assume int is 32-bits */
if (server)
{
/* Server side */
num = 0x17;
/* Convert to network byte order. */
num = htonl(num);
if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num))
{
/* Handle error */
}
return 0;
}
else {
if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num))
{
/* Handle error */
}
/* Convert to host byte order. */
num = ntohl(num);
if (num > 255)
{
return 255;
}
else
{
return num;
}
}
}