#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <stdlib.h>
#include <winsock2.h>
#define SIZE 10000
using namespace std;
const std::string host = "81.19.81.199"; // IP of overpass.osm.rambler.ru
const int port = 80;
//(lower lat, usually lower lon, higher lat, usually higher lon).
const std::string query = "GET /cgi/interpreter?data=[out:json];(node(18.51507,73.87276,18.53597,73.90142);way(18.51507,73.87276,18.53597,73.90142);node(w)->.x;);out; HTTP/1.1\r\n"
"Host: overpass.osm.rambler.ru\r\n"
"User-Agent: SteveC\r\n"
"Accept: */*\r\n"
"Connection: close\r\n"
"\r\n";
int main(int argc, char* argv[]) {
FILE *fp = fopen ("d://test.txt", "r+");
// Initialize Winsock.
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]);
}
}
return 0;
}
In this program some extra garbage values are inserted like :
{
"type": "node",
"id": 245647473,
"lat": 18.5289245,
"lon": 73.9019677,
"tags": {
"source": "AND"
}
},
{
1000 // garbage...
"type": "node",
"id": 245647482,
"lat": 18.5301753,
"lon": 73.8676588,
"tags": {
"source": "AND"
}
},
While executing the query in browser gives no problem. Earlier I thought there is some problem while writing to file, but the output by /std::cout << &buf[0];/ also gives the same result. Also the garbage value gets inserted in the same place every time I run the program. Why does it happen ?
asked 30 Jan '13, 06:35

Anubha
31●3●3●6
accept rate: 0%
Thank you scai, its a real comfort to know those values are not junk, now that I know this I will support them in my parser happily. As for third-party library, for now JSON parser code I wrote works okay and renders pretty roads(with some nodes missing due to this encoding).In this month I coded the 3d car that is to travel these roads. Hope to complete the road stuff in feb. Your help so far is highly appreciated.