bool Control::write_ok(ofstream& out_file, char* out_filename, char* msg) { int state = out_file.rdstate(); if ( state & (ios::failbit | ios::badbit) ) { strstream strm; strm << "Error! Cannot write data to the file:" << endl; strm << out_filename; if ( msg != NULL ) { strm << endl << msg; } strm << ends; theUI->errMsg(0, strm.str()); return false; } return true; }
//start the socket server, listen to client void HttpServer::StartUp() { if (g_show_log) { outputFile.open("httpserver_log.txt", ios::out); if ((outputFile.rdstate() & std::ifstream::failbit) != 0) { cout << "Error opening 'httpserver_log.txt'" << endl; g_openlog_fail = true; } DBG_ONLY("httpserver.g_port is:" << g_port); } #if defined(__WIN32__) || defined(__WIN64__) WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { cout << "fail to init socket !!!" << endl; if (g_show_log) DBG_ONLY("fail to init socket !!!"); return; } #endif if ((serversocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("fail to create server socket !!!"); if (g_show_log) DBG_ONLY("fail to create server socket !!!"); return; } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(g_port); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); int tmp = 1; #if defined(__WIN32__) || defined(__WIN64__) if (setsockopt (serversocket, SOL_SOCKET, SO_REUSEADDR, (char *)&tmp, sizeof(int)) < 0) ; #else if (setsockopt (serversocket, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(int)) < 0) #endif if (g_show_log) DBG_ONLY("fail to set SO_REUSEADDR !!!"); struct linger so_linger; so_linger.l_onoff = true; so_linger.l_linger = 10; // wait 10 seconds to close, to avoid TIME_WAIT of client #if defined(__WIN32__) || defined(__WIN64__) if (setsockopt (serversocket, SOL_SOCKET, SO_LINGER, (char *)&so_linger, sizeof(so_linger)) < 0) #else if (setsockopt (serversocket, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger)) < 0) #endif if (g_show_log) DBG_ONLY("fail to set SO_LINGER !!!"); if (bind (serversocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("fail to bind address !!!"); if (g_show_log) DBG_ONLY("fail to bind address !!!"); return; } if (listen(serversocket, 5) < 0) { perror("fail to listen !!!"); if (g_show_log) DBG_ONLY("fail to listen !!!"); return; } gIsRun = 1; cout << "[ Server is running, bind to " << g_port << " .....]" << endl; if (g_show_log) DBG_ONLY("[ Server is running, bind to " << g_port << " .....]"); #if defined(__WIN32__) || defined(__WIN64__) pthread_t thread_id; pthread_create(&thread_id, NULL, socket_thread, NULL); if (thread_id.p) pthread_join(thread_id, NULL); WSACleanup(); #else daemon(0, 0); pthread_t thread_id; pthread_create(&thread_id, NULL, socket_thread, NULL); if (thread_id != 0) pthread_join(thread_id, NULL); #endif }