这是创建套接字的代码,接收的数据存储在文本文件中
// Initialize Winsock.
cout << "connecting1\n";
WSADATA wsadata;
int iResult = WSAStartup (MAKEWORD(2,2), &wsadata );
if (iResult !=NO_ERROR )
printf("\nmyERROR at WSAStartup()\n");
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("error opening socket"); return -1;
}
struct sockaddr_in sin;
sin.sin_port = htons(port);
sin.sin_addr.s_addr = inet_addr(host.c_str());
sin.sin_family = AF_INET;
if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
perror("error connecting to host"); return -1;
}
const int query_len = query.length() + 1; // trailing '\0'
if (send(sock, query.c_str(), query_len, 0) != query_len) {
perror("error sending query"); return -1;
}
const int buf_size = 1024 * 1024;
while (true) {
std::vector<char> buf(buf_size, '\0');
const int recv_len = recv(sock, &buf[0], buf_size - 1, 0);
if (recv_len == -1) {
perror("error receiving response"); return -1;
} else if (recv_len == 0) {
std::cout << std::endl; break;
} else {
std::cout << &buf[0];
fprintf(fp, "%s", &buf[0]); // this lines writes to file
}
}
这里的数据大多以适当的格式返回,但在某些情况下会发生这种情况:
{
"type": "node",
"id":
1000 // this 1000 is un-wanted
1812432236,
"lat": 20.2608987,
"lon": 85.8379894
},
因此我的程序无法正确解析此节点。 在url中编写查询时,数据以适当的格式显示。 每次运行程序时,垃圾值也会插入到同一个地方。 为什么会发生这种情况?
答案 0 :(得分:1)
我从openStreetMap帮助论坛得到了答案,该论坛更具体针对上述问题......
答案 1 :(得分:0)
在recv函数中,它调用缓冲区的字符指针。您已将缓冲区声明为chars的向量,这与char buf [1024 * 1024]不同。所以我相信当你将它打印到文件时,向量将返回项目结构的字符串。该向量包含1024 * 1024个char类型的对象,而不是1024 * 1024大小的连续内存来存储字符。 1024 * 1024向量包含作为单独元素存储的字符对象,但不作为内存中的连续分配。
我会将 std :: vector buf(buf_size,'\ 0'); 更改为 char buf [1024 * 1024]; ,然后执行 memset(buf,0,1024 * 1024)在使用recv读取数据之前。我认为这将纠正这个问题(假设您没有通过套接字发送\ 0作为数据,这将指示字符串的结尾,在这种情况下%s将停止在该点打印出数据)。