我是一个新手在编程; 我需要从C ++中的程序发送一些浮点值到C中的另一个。我在互联网上find了这个示例代码,并设法使其正常工作:
服务器:
#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 the socket listenfd = socket (AF_INET, SOCK_STREAM, 0); //preparation of the 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 for connections."); for ( ; ; ) { 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 from and resent to the client:"); puts(buf); send(connfd, buf, n, 0); } if (n < 0) { perror("Read error"); exit(1); } close(connfd); } //close listening socket close(listenfd); }
客户:
#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 the arguments //additional checks can be inserted if (argc !=2) { perror("Usage: TCPClient <IP address of the server"); exit(1); } //Create a socket for the client //If sockfd<0 there was an error in the creation of the socket if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) <0) { perror("Problem in creating the socket"); exit(2); } //Creation of the 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 to big-endian order //Connection of the client to the socket if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0) { perror("Problem in connecting to the 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 from the server: "); fputs(recvline, stdout); } exit(0); }
所以我必须添加发送一个浮点值到服务器,并得到它回来? 这些机器都是基于x86的,一个安装了Debian 6,另一个安装Linux Mint。 我尝试了两种方式(Debian与客户端和Linux Mint与服务器和Debian与服务器和Linux Mint与客户端),它工作正常。 我正在m thinking about making some casting between a char value and float... It
可能吗? 有没有办法发送它,而不是铸造? 我不需要一个char值,只有一些浮点值。 谢谢你们的帮助!
编辑:我尝试了snprintf和sscanf,但我做错了,因为它不能正常工作。 以下是目前的客户端和服务器:
客户:
#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; a = 0; b = 0; c = 0; c = a + 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 the arguments //additional checks can be inserted if (argc !=2) { perror("Usage: TCPClient <IP address of the server"); exit(1); } //Create a socket for the client //If sockfd<0 there was an error in the creation of the socket if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) <0) { perror("Problem in creating the socket"); exit(2); } //Creation of the 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 to big-endian order //Connection of the client to the socket if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0) { perror("Problem in connecting to the 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 from the server: "); fputs(recvline, stdout); } exit(0); }
服务器:
#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 the socket listenfd = socket (AF_INET, SOCK_STREAM, 0); //preparation of the 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 for connections."); for ( ; ; ) { 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 from and resent to the 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); }
程序奇怪,它显示像0.0000e的值或有时不显示任何内容。 我需要发送各种浮点值,所以这个程序只是一个例子,如何发送一个浮点值。 任何人都可以看到我的程序错误在哪里? 谢谢!
代码可以使用二进制表示形式发送float
。 这可能在匹配良好的系统上工作,否则可能由于不同的float
表示或字节顺序而失败。 @ clarasoft,它
float x = ...; // send send(sockfd, &x, sizeof x, 0); // receive recv(connfd, &x, sizeof x, 0);
备用代码可以使用字符串表示形式发送带有足够数字的float
。 这是更便携的。 它没有endian – ness问题。 它确实需要输送字符串长度信息。 @ user3386109 @EOF
如果浮点格式在结尾处有所不同,范围和精度问题可能需要额外的处理,不管使用什么方法,这都是一个问题。
#include <float.h> #define FLT_EXPO_SIZE 5 // send // create a buffer large enough // - d . ddddd e - expo \0 char buf[1 + 1 + 1 + (FLT_DECIMAL_DIG - 1) + 1 + 1 + FLT_EXPO_SIZE + 1]; // print the value to enough digits to distinguish x from all 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
笔记:
其他代码可以用来更好地定义FLT_EXPO_SIZE
比保守的5.一些基于FLT_MIN_EXP
, FLT_MAX_EXP
和FLT_TRUE_MIN
。
可以使用sprintf("%a", x);
为十六进制表示。 TBD缓冲区大小在这种情况下需要。 仍然可以使用sscanf(buf, "%f", &x)
可以使用snprintf()
。
为简洁起见省略了各种错误检查。