示例#1
0
	/**
	 * 計測データをファイルへ追記出力します。
	 */
	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);
	}
示例#2
0
	/**
	 * 計測データを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);
		}
	}