2009-07-31 2 views
2

Я использую TCP/IP программирование сокетов. У меня есть значение с плавающей запятой хранится в переменной ret_val в моем коде сервера, который я хочу отправить клиенту, который ждет его получения.Отправка числа с плавающей запятой от сервера к клиенту

Как я могу это сделать?

+2

Возможно, будет полезно указать язык и/или время выполнения, которое используется отправителем и получателем. –

ответ

5

Если вы знаете, что оба клиента и сервер являются одной и той же платформой и т. Д., Вы можете просто использовать sizeof(float), чтобы определить размер вашего буфера и скопировать столько байтов с адреса вашего поплавка.

float number = 123.45; 
send(sockfd, &number, sizeof(float),0); 

Как только ваш клиент/сервер разные платформы/разные языки и т.д., вам придется начать беспокоиться о том, как переносимый кодировать поплавок. Но для простого подхода вышеуказанное будет работать нормально.

+0

Спасибо Брайан, его работа отлично. –

+0

Отлично. Thx для обратной связи –

+0

для кодирования, я бы предложил XDR http://www.isi.edu/in-notes/rfc1832.txt – fortran

5
float f = ...; 
size_t float_size = sizeof(float); 
const char* buffer = (const char *) &f; 
send(mySocket, buffer, float_size, 0); 

Этот код будет работать нормально, если сервер и клиент используют одну и ту же платформу. Если платформы отличаются друг от друга, вам придется согласовывать размеры сообщений и конкретизацию явно.

3

Использовать текстовое представление?

char buf[32] ; 
snprintf(buf,sizeof buf,"%f",ret_val); 
write(fd,buf,strlen(buf)); 

Вы можете прочитать эту строку и проанализировать ее снова с помощью sscanf. (Может быть, даже сделать его линии прекращено - «% е \ п». - так что вы будете знать, когда число заканчивается)

Прямой подход просто

write(fd,&ret_val,sizeof ret_val); 

В обоих случаях вы должны проверить вернуть значение записи и принять правильное действие, если произошла ошибка, или write() написал меньше байтов, чем вы сказали.

Смежные вопросы