#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;
}
}
}