Поскольку никто не упомянул sprintf
, вы можете просто преобразовать любую переменную в char*
, используя ее, и отправить
if(strcmp(buf,"movUP") == 0)
{
char* msg = calloc(1, 20);
pos.y += 0.0001f;
sprintf(msg,"NEW::POS::Y=%.4f", pos.y);
sendto(master, msg, 20, 0, (struct sockaddr*)&client, addrlen);
}
Test
movUP
NEW::POS::Y=0.0001
movUP
NEW::POS::Y=0.0002
movUP
NEW::POS::Y=0.0003
movUP
NEW::POS::Y=0.0004
Используйте %d
для целых чисел, %f
для чисел с плавающей запятой
в преобразование обратно в целое число, используйте atoi(char*)
в преобразование назад до числа с плавающей запятой, используйте atof(char*)
перед преобразованием, обязательно используйте strstr()
, чтобы получить значение с плавающей запятой только , начиная с "0"
float myPos; // floating variable that stores Object's Position in the World
...
....
memset(buf, 0, MAXBUFFER); // clears the previous buffer
recvfrom(master, buf, MAXBUFFER, 0, (struct sockaddr*)&server, &addrlen);
char* newY = strstr(buf, "0");// NEW::POS::Y=0.0001 --->> 0.000100
myPos = atof(newY); // new object's position by the server
printf("My New Position is %.4f\n", myPos); // Out: My New Position is 0.0011 -> 0.0012 -> 0.0013 -> 0.0014.
Для целых чисел ( не позиций), вы можете использовать ту же технику и просто умножить ее, как
float f = 0.000002f; // that is supposed to be 2 integer value
int i = (int)(f*1000000); // now, i = 2
, описанные выше методы полностью безопасны
Если выесли вы хотите более точное преобразование, вы можете использовать strncpy
или memcpy
и вырезать строку, начиная с заданного индекса, с некоторой длиной, предполагая, что вы уже знаете входящий буфер, но, по моему личному мнению, я не очень рекомендую этоособенно в сокетах без соединения , подобных этому, много вычислений и вызовов для длины буфера, не легко отладитьУж иногда, если вы не совсем понимаете, что делаете.
Примечание 1 : будьте осторожны, чтобы не включали нули в вашем буфере , когда вы ожидаете сервер move / position или любую количественную переменную, если вы планируете использовать 1-й метод.
Примечание 2 : Вы можете просто отправить целое число или с плавающей точкой , преобразовать его и наоборот без необходимости вырезать или умножить это.
Пусть новые разработчики игровых сетей найдут этот ответ полезным, так как мыне может отправлять или получать, кроме char*
с UDP sendto (), recvfrom ().