/** * 計測データをファイルへ追記出力します。 */ void OutputToFile(const SYSTEMTIME &currTime, double temp, double humid) { if(outputFilename_.empty()){ return; } char str[512]; const int size = std::sprintf( str, "%04d/%02d/%02d %02d:%02d:%02d,%lf,%lf\r\n", currTime.wYear, currTime.wMonth, currTime.wDay, currTime.wHour, currTime.wMinute, currTime.wSecond, temp, humid); HANDLE hFile = ::CreateFile(outputFilename_.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ::SetFilePointer(hFile, 0, NULL, FILE_END); DWORD written = 0; ::WriteFile(hFile, str, size, &written, NULL); ::CloseHandle(hFile); }
/** * 計測データをHTTPのGETメソッドのパラメータとして出力します。 * http://example.jp/record.cgi?temp=25.543&humid=45.123 のような形式でアクセスします。 */ void OutputToHTTP(const SYSTEMTIME &currTime, double temp, double humid) { if(outputHTTPURL_.empty()){ return; } ///@todo ポート指定できるようにする。 ///@todo 先頭に http:// と入れても大丈夫なようにする。 const StdString::size_type firstSlashPos = outputHTTPURL_.find_first_of('/'); const StdString destHostName = (firstSlashPos != StdString::npos) ? outputHTTPURL_.substr(0, firstSlashPos) : outputHTTPURL_; const StdString destURL = (firstSlashPos != StdString::npos) ? outputHTTPURL_.substr(firstSlashPos) : "/"; struct Local { static bool connectToHost(SOCKET &sock, const char *hostname) { sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.S_un.S_addr = inet_addr(hostname); if(server.sin_addr.S_un.S_addr == 0xffffffff) { hostent *host = gethostbyname(hostname); if(host == NULL){ return false; } unsigned int **addrptr = (unsigned int **)host->h_addr_list; for(; *addrptr != NULL; ++addrptr){ server.sin_addr.S_un.S_addr = *(*addrptr); if(connect(sock, (sockaddr *)&server, sizeof(server)) == 0){ break; } } if(*addrptr == NULL){ return false; } } else{ if (connect(sock, (sockaddr *)&server, sizeof(server)) != 0){ return false; } } return true; } }; SOCKET sock; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock != INVALID_SOCKET) { // 接続 if(Local::connectToHost(sock, destHostName.c_str())){ // リクエスト作成 char requestParams[1024]; std::sprintf(requestParams, "?temp=%lf&humid=%lf", temp, humid); std::string request = std::string("GET ") + destURL + requestParams + " HTTP/1.0\r\n\r\n"; // HTTPリクエスト送信 bool error = false; int n = send(sock, request.c_str(), request.size(), 0); if(n < 0) { error = true; } // HTTPメッセージ受信 std::string result; while(n > 0){ char buf[128]; n = recv(sock, buf, sizeof(buf), 0); if(n < 0) { error = true; break; } // 受信結果 result.append(buf, n); } } closesocket(sock); } }