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... it
s 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:
other code used better define
flt_expo_size
conservative 5. based onflt_min_exp
,flt_max_exp
, maybeflt_true_min
.could use
sprintf("%a", x);
hex representation. tbd buffer size needs in case. still can usesscanf(buf, "%f", &x)
could use
snprintf()
.various error checking omitted brevity.
Comments
Post a Comment