Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过服务器c+发送(序列化)浮点向量+;? 我在C++中建立了一个Web服务器。我需要从服务器返回一个向量形式的特征向量。我看到套接字不允许这样的对象直接通过,但需要序列化它。我试图通过将向量结果转换为char*a来序列化它。但当我做卷曲请求时,它仍然一无所获。 有人能告诉我这里的诀窍吗 /* A simple server in the internet domain using TCP The port number is passed as an argument */ // server.cpp #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <vector> #include <iostream> void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd,5); while (1 == 1) { clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) error("ERROR reading from socket"); printf("before result: %s\n",buffer); std::vector<float> fv; fv.push_back(7); fv.push_back(8); char* result = reinterpret_cast<char*>(&fv); send(newsockfd, result, sizeof(result), 0); //n = write(newsockfd,"I got your message",18); //if (n < 0) error("ERROR writing to socket"); printf("message sent. \n"); close(newsockfd); //close(sockfd); } return 0; }_C++_Sockets_Vector - Fatal编程技术网

如何通过服务器c+发送(序列化)浮点向量+;? 我在C++中建立了一个Web服务器。我需要从服务器返回一个向量形式的特征向量。我看到套接字不允许这样的对象直接通过,但需要序列化它。我试图通过将向量结果转换为char*a来序列化它。但当我做卷曲请求时,它仍然一无所获。 有人能告诉我这里的诀窍吗 /* A simple server in the internet domain using TCP The port number is passed as an argument */ // server.cpp #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <vector> #include <iostream> void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd,5); while (1 == 1) { clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) error("ERROR reading from socket"); printf("before result: %s\n",buffer); std::vector<float> fv; fv.push_back(7); fv.push_back(8); char* result = reinterpret_cast<char*>(&fv); send(newsockfd, result, sizeof(result), 0); //n = write(newsockfd,"I got your message",18); //if (n < 0) error("ERROR writing to socket"); printf("message sent. \n"); close(newsockfd); //close(sockfd); } return 0; }

如何通过服务器c+发送(序列化)浮点向量+;? 我在C++中建立了一个Web服务器。我需要从服务器返回一个向量形式的特征向量。我看到套接字不允许这样的对象直接通过,但需要序列化它。我试图通过将向量结果转换为char*a来序列化它。但当我做卷曲请求时,它仍然一无所获。 有人能告诉我这里的诀窍吗 /* A simple server in the internet domain using TCP The port number is passed as an argument */ // server.cpp #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <vector> #include <iostream> void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"ERROR, no port provided\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd,5); while (1 == 1) { clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("ERROR on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) error("ERROR reading from socket"); printf("before result: %s\n",buffer); std::vector<float> fv; fv.push_back(7); fv.push_back(8); char* result = reinterpret_cast<char*>(&fv); send(newsockfd, result, sizeof(result), 0); //n = write(newsockfd,"I got your message",18); //if (n < 0) error("ERROR writing to socket"); printf("message sent. \n"); close(newsockfd); //close(sockfd); } return 0; },c++,sockets,vector,C++,Sockets,Vector,并运行: ./server 8080 对于卷曲请求: curl http://localhost:8080 我得到: alliey:socket alliey$ curl http://localhost:8080 `N�. 我应该如何解释响应?我只需发送原始数据就可以理解: send(newsockfd, result.data(), sizeof(result[0])*result.size(), 0); 在客户端,我使用python struck.unpack来接收结果。它工作得

并运行:

 ./server 8080
对于卷曲请求:

curl http://localhost:8080
我得到:

alliey:socket alliey$ curl http://localhost:8080
`N�.

我应该如何解释响应?

我只需发送原始数据就可以理解:

send(newsockfd, result.data(), sizeof(result[0])*result.size(), 0);
在客户端,我使用python struck.unpack来接收结果。它工作得很好


但还是要感谢上面所有的提示

1)“我看到套接字不允许此类对象直接通过,但需要序列化它。”
(char*)&result
不是std::vector的序列化。2)
sizeof(a)
in
send(newsockfd,a,sizeof(a),0)
相当于
sizeof(char*)
,我怀疑您是否想到了这一点。3)考虑学习,而不是随机编码。在你的例子中,对语言及其概念有很多基本的误解。你可以通过网络传递该向量中的每一个元素,然后重新构建它,如果你想快速而肮脏的solution@AlgirdasPreidžius谢谢,那么我应该如何正确地序列化它呢?所有的向量都将包含:7和8?您可以使用char数组,然后将其指针传递给write函数。序列化的一种方法是格式化为
std::stringstream
。您还可以找到一个用于编写JSON或XML的库。
send(newsockfd, result.data(), sizeof(result[0])*result.size(), 0);