Sending float values on socket C/C++ -


i`m newbie @ programming; need send float values program in c++ 1 in c. found sample code on internet , managed make works properly:

server:

#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <unistd.h>  #define maxline 4096 /*max text line length*/ #define serv_port 3000 /*port*/ #define listenq 8 /*maximum number of client connections */  int main (int argc, char **argv) {     int listenfd, connfd, n;     socklen_t clilen;     char buf[maxline];     struct sockaddr_in cliaddr, servaddr;      //creation of socket     listenfd = socket (af_inet, sock_stream, 0);      //preparation of socket address      servaddr.sin_family = af_inet;     servaddr.sin_addr.s_addr = htonl(inaddr_any);     servaddr.sin_port = htons(serv_port);      bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));      listen(listenfd, listenq);      printf("%s\n","server running...waiting connections.");      ( ; ; ) {          clilen = sizeof(cliaddr);         connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);         printf("%s\n","received request...");          while ( (n = recv(connfd, buf, maxline,0)) > 0)  {             printf("%s","string received , resent client:");             puts(buf);             send(connfd, buf, n, 0);         }          if (n < 0) {             perror("read error");              exit(1);         }         close(connfd);      }     //close listening socket     close(listenfd);   } 

client:

#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h>   #define maxline 4096 /*max text line length*/ #define serv_port 3000 /*port*/  int main(int argc, char **argv)  {     int sockfd;     struct sockaddr_in servaddr;     char sendline[maxline], recvline[maxline];      //basic check of arguments     //additional checks can inserted     if (argc !=2) {         perror("usage: tcpclient <ip address of server");          exit(1);     }      //create socket client     //if sockfd<0 there error in creation of socket     if ((sockfd = socket (af_inet, sock_stream, 0)) <0) {         perror("problem in creating socket");         exit(2);     }      //creation of socket     memset(&servaddr, 0, sizeof(servaddr));     servaddr.sin_family = af_inet;     servaddr.sin_addr.s_addr= inet_addr(argv[1]);     servaddr.sin_port =  htons(serv_port); //convert big-endian order      //connection of client socket      if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0) {         perror("problem in connecting server");         exit(3);     }      while (fgets(sendline, maxline, stdin) != null) {          send(sockfd, sendline, strlen(sendline), 0);          if (recv(sockfd, recvline, maxline,0) == 0){             //error: server terminated prematurely             perror("the server terminated prematurely");              exit(4);         }         printf("%s", "string received server: ");         fputs(recvline, stdout);     }      exit(0); } 

so have add send float value server , back? machines both x86 based, 1 debian 6 installed , other 1 linux mint. tried in both ways (debian client , linux mint server , debian server , linux mint client) , works ok. im thinking making casting between char value , float... its possible? there way send without casting? don`t need char value, float values. guys!

edit: tried snprintf , sscanf, im doing wrong because doesnt works properly. here client , server @ moment:

client:

#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h>   #define maxline 4096 /*max text line length*/ #define serv_port 3000 /*port*/  int main(int argc, char **argv)  {  int sockfd;  struct sockaddr_in servaddr;  char sendline[maxline], recvline[maxline], buffer [256]; //aƱadidas por mi//  float a, b, c;  = 0;  b = 0;  c = 0;  c = + b;    printf("\nprimer numero: ");   scanf("%f", &a);   printf ("\nsegundo numero: ");   scanf ("%f", &b);  sprintf(buffer, "%f", sizeof c, c);   unsigned char len = strlen(buffer);   //basic check of arguments  //additional checks can inserted  if (argc !=2) {   perror("usage: tcpclient <ip address of server");   exit(1);  }   //create socket client  //if sockfd<0 there error in creation of socket  if ((sockfd = socket (af_inet, sock_stream, 0)) <0) {   perror("problem in creating socket");   exit(2);  }   //creation of socket  memset(&servaddr, 0, sizeof(servaddr));  servaddr.sin_family = af_inet;  servaddr.sin_addr.s_addr= inet_addr(argv[1]);  servaddr.sin_port =  htons(serv_port); //convert big-endian order   //connection of client socket   if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0) {   perror("problem in connecting server");   exit(3);  }   while (fgets(sendline, maxline, stdin) != null) {    send(sockfd, sendline, strlen(sendline), 0);   send(sockfd, &len, sizeof len, 0);   send (sockfd, buffer, sizeof buffer, 0);    if (recv(sockfd, recvline, maxline,0) == 0){    //error: server terminated prematurely    perror("the server terminated prematurely");     exit(4);   }   printf("%s", "string received server: ");   fputs(recvline, stdout);  }   exit(0); } 

server:

#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <unistd.h>  #define maxline 4096 /*max text line length*/ #define serv_port 3000 /*port*/ #define listenq 8 /*maximum number of client connections */  int main (int argc, char **argv) {  float c;  int listenfd, connfd, n;  socklen_t clilen;  char buf[maxline], buf256[256], buffer[256];  unsigned char len = strlen(buffer);  struct sockaddr_in cliaddr, servaddr;   //creation of socket  listenfd = socket (af_inet, sock_stream, 0);   //preparation of socket address   servaddr.sin_family = af_inet;  servaddr.sin_addr.s_addr = htonl(inaddr_any);  servaddr.sin_port = htons(serv_port);   bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));   listen(listenfd, listenq);   printf("%s\n","server running...waiting connections.");   ( ; ; ) {    clilen = sizeof(cliaddr);   connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);   printf("%s\n","received request...");    while ( (n = recv(connfd, buf, maxline,0)) > 0)  {    printf("%s","string received , resent client:");    puts(buf);      recv(connfd, &len, sizeof len, 0);    recv(connfd, buf256, len, 0);    recv(connfd, buffer, 256, 0);    buf256[len] = 0;    sscanf(buffer, "%f", &c);    puts(buffer);    printf ("\n%f", &c);       send(connfd, buf, n, 0);   }   if (n < 0) {   perror("read error");    exit(1);  }  close(connfd);   }  //close listening socket  close(listenfd);  } 

the programs works weird, shows values 0.0000e or doesnt show nothing. need send various float values, program example on how send 1 float value. can see error in program? thanks!

code can send float using binary representation. may work on matched systems, else may fail due differing float representation or endian-ness. @clarasoft-it

float x = ...;  // send send(sockfd, &x, sizeof x, 0);  // receive recv(connfd, &x, sizeof x, 0); 

alternative code can send float using string representation printing sufficient digits. more portable. not have endian-ness issue. require conveying string length information. @user3386109 @eof

if floating point format differ @ ends, range , precision issues may need additional handling, concern regardless of method used.

#include <float.h> #define flt_expo_size 5  // send // create buffer large enough //       -   d   .     ddddd                 e   -       expo       \0 char buf[1 + 1 + 1 + (flt_decimal_dig - 1) + 1 + 1 + flt_expo_size + 1]; // print value enough digits distinguish x other float unsigned char len = sprintf(buf, "%.*e", flt_decimal_dig - 1, x); send(sockfd, &len, sizeof len, 0); send(sockfd, buf, sizeof buf, 0);  // receive char buf256[256]; recv(connfd, &len, sizeof len, 0); recv(connfd, buf256, len, 0); buf256[len] = 0; sscanf(buf256, "%f", &x);              // add sscanf() check 

notes:

  1. other code used better define flt_expo_size conservative 5. based on flt_min_exp, flt_max_exp , maybe flt_true_min.

  2. could use sprintf("%a", x); hex representation. tbd buffer size needs in case. still can use sscanf(buf, "%f", &x)

  3. could use snprintf().

  4. various error checking omitted brevity.


Comments