// socket to server // for WinSock 1 SOCKET NetThread::socketToServer() { SOCKET sock = INVALID_SOCKET; struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; char server[512]; HOSTENT *host; unsigned int address; int result; // server name result = snprintf(server, 256, "%s", qPrintable(settings->getServerName())); if (result <= 0 || result > 255){ if (settings->getOutputLog()){ const QString text = QString("socketToServer() : snprintf() error! for server"); emit outputLogMessage(PHASE_DEBUG, text); } return INVALID_SOCKET; } host = gethostbyname(server); if (host == 0){ address = inet_addr(server); host = gethostbyaddr((char*)&address, 4, AF_INET); } if (host == 0){ return INVALID_SOCKET; } addr.sin_port = htons(settings->getPortNo()); addr.sin_addr.s_addr = *((u_long*)host->h_addr); sock = socket(AF_INET, SOCK_STREAM, 0); result = connect_int(sock, (struct sockaddr *)&addr, sizeof(addr)); if (result == SOCKET_ERROR){ sock = INVALID_SOCKET; } // for socket option if (sock != INVALID_SOCKET){ // set socket option setSocketOption(sock); // check socket option if (outputLog) checkSocketOption(sock); } else { // INVALID_SOCKET if (settings->getOutputLog()){ const QString text = "socketToServer() : sock = INVALID_SOCKET"; emit outputLogMessage(PHASE_DEBUG, text); } } return sock; }
Gesture::Detected Gesture::gestureAccepted() { // If we are logging, and a yes or no decision is made, log it if (_logFileStream) outputLogMessage(true, QString("Gesture accepted")); return Gesture::Yes; }
//--------------------------------------------------------------------------- // protected //--------------------------------------------------------------------------- // thread body void NetThread::run() { if (settings->getOutputLog()) cout << "[" << name << "]" << " start thread...start run()" << endl << flush; // start thread runThread = true; // main loop while(runThread){ // set start time of main loop startTime = QDateTime::currentDateTime().toMSecsSinceEpoch(); //QThread::msleep(5); // 5 (ms) sleep QThread::msleep(threadSleepTime); // threadSleepTime (ms) sleep CONNECT_RESULT result_connect = connectToServer(); if (result_connect != CONNECT_SUCCEEDED){ if (result_connect == CONNECT_WAITED_COUNT){ continue; } if (result_connect == CONNECT_FAILED){ //cout << "[" << name << "]" << " connect Error: connectToServer()" << endl << flush; // error shutdownConnection(); emit networkError(true); //emit outputLogMessage(QTB_MSG_CONNECT_ERROR); continue; } if (result_connect == CONNECT_FAILED_RETRY){ if (settings->getOutputLog()) cout << "[" << name << "]" << " connect Error: connectToServer()" << endl << flush; // error runThread = false; break; } } // process header (send and receive) PROCESS_RESULT result_process = processForHeader(); if (result_process != PROCESS_SUCCEEDED){ if (result_process == PROCESS_RESTART){ // restart shutdownConnection(); QThread::sleep(2); emit networkError(true); continue; } if (result_process == PROCESS_NETWORK_ERROR){ // error if (settings->getOutputLog()) cout << "[" << name << "]" << " Network Error: processForHeader()" << endl << flush; // error shutdownConnection(); emit networkError(true); continue; } if (result_process == PROCESS_PASSWORD_ERROR){ // error if (settings->getOutputLog()) cout << "[" << name << "]" << " Password Error: processForHeader()" << endl << flush; // error shutdownConnection(); runThread = false; emit networkError(false); emit outputLogMessage(QTB_MSG_PASSWORD_ERROR); break; } if (result_process == PROCESS_CONNECT_ERROR){ // error if (settings->getOutputLog()) cout << "[" << name << "]" << " Connect Error: processForHeader()" << endl << flush; // error shutdownConnection(); runThread = false; emit networkError(false); emit outputLogMessage(QTB_MSG_ALREADY_CONNECT_ANOTHER_CLIENT); break; } if (result_process == PROCESS_VIDEO_MODE_ERROR){ // error if (settings->getOutputLog()) cout << "[" << name << "]" << " Connect Error: processForHeader()" << endl << flush; // error shutdownConnection(); runThread = false; emit networkError(false); emit outputLogMessage(QTB_MSG_NOTSUPPORT_VIDEO_MODE); break; } if (result_process == PROCESS_UNKNOWN_ERROR){ // error if (settings->getOutputLog()) cout << "[" << name << "]" << " Unkown Error: processForHeader()" << endl << flush; // error shutdownConnection(); runThread = false; emit networkError(false); emit outputLogMessage(QTB_MSG_UNKNOWN_ERROR); break; } } // transmit local buffer to device buffer TRANSMIT_RESULT result_transmit = transmitBuffer(); switch(result_transmit){ case TRANSMIT_SUCCEEDED: // Nothing to do break; case TRANSMIT_RESTART: // restart shutdownConnection(); QThread::sleep(2); emit networkError(true); continue; break; case TRANSMIT_NETWORK_ERROR: if (settings->getOutputLog()) cout << "[" << name << "]" << " Failed: transmitBuffer(): network error" << endl << flush; // error shutdownConnection(); emit networkError(true); continue; break; case TRANSMIT_DATASIZE_ERROR: if (settings->getOutputLog()) cout << "[" << name << "]" << " Failed: transmitBuffer(): data size" << endl << flush; // error break; case TRANSMIT_FAILED_PUT_BUFFER: if (settings->getOutputLog()) cout << "[" << name << "]" << " Failed: transmitBuffer(): put buffer." << endl << flush; // error break; case TRANSMIT_FAILED_TRANSMIT_DEVICE_BUFFER: if (settings->getOutputLog()) cout << "[" << name << "]" << " Failed: transmitBuffer(): transmit device buffer." << endl << flush; // error break; case TRANSMIT_FAILED_IMAGE_DRAW: if (settings->getOutputLog()) cout << "[" << name << "]" << " Failed: transmitBuffer(): image draw." << endl << flush; // error break; default: // error ABORT(); break; } } // disconnect shutdownConnection(); if (settings->getOutputLog()) cout << "[" << name << "]" << " stop thread...exit run()" << endl << flush; }
// socket to server SOCKET NetThread::socketToServer() { SOCKET sock = INVALID_SOCKET; ADDRINFO *addrinfo; ADDRINFO addrinfo_hints; memset(&addrinfo_hints, 0, sizeof(ADDRINFO)); #if 0 // for TEST addrinfo_hints.ai_family = AF_INET; // for IP v4 #else // for TEST addrinfo_hints.ai_family = AF_UNSPEC; #endif // for TEST addrinfo_hints.ai_socktype = SOCK_STREAM; char server[512]; char port[16]; int error; int result; result = snprintf(server, 256, "%s", qPrintable(settings->getServerName())); if (result <= 0 || result > 255){ if (settings->getOutputLog()){ const QString text = QString("socketToServer() : snprintf() error! for server"); emit outputLogMessage(PHASE_DEBUG, text); } return INVALID_SOCKET; } result = snprintf(port, 10, "%d", settings->getPortNo()); if (result <= 0 || result > 9){ if (settings->getOutputLog()){ const QString text = QString("socketToServer() : snprintf() error! for port"); emit outputLogMessage(PHASE_DEBUG, text); } return INVALID_SOCKET; } error = getaddrinfo(server, port, &addrinfo_hints, &addrinfo); if (error != 0){ #if defined(QTB_NET_WIN) if (settings->getOutputLog()){ const QString text = QString("socketToServer() : getaddrinfo(): error = ") + QString::number(error); emit outputLogMessage(PHASE_DEBUG, text); } #elif defined(QTB_NET_UNIX) if (settings->getOutputLog()){ const QString text = QString("socketToServer() : getaddrinfo(): strerror = ") + gai_strerror(error); emit outputLogMessage(PHASE_DEBUG, text); } #endif // defined(QTB_NET_UNIX) return INVALID_SOCKET; } ADDRINFO *topAddrinfo = addrinfo; for (; addrinfo != NULL; addrinfo = addrinfo->ai_next){ #if !defined(Q_OS_WIN) // Portable Vresion (for MacOSX, FreeBSD...) sock = connect_retry(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol, addrinfo->ai_addr, (int)addrinfo->ai_addrlen); if (sock == INVALID_SOCKET){ continue; } #else sock = socket(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol); if (sock == INVALID_SOCKET){ continue; } if (connect_retry(sock, addrinfo->ai_addr, (int)addrinfo->ai_addrlen) == SOCKET_ERROR){ closesocket(sock); sock = INVALID_SOCKET; continue; } #endif break; } // free all addrinfo while(topAddrinfo != NULL){ addrinfo = topAddrinfo; topAddrinfo = addrinfo->ai_next; freeaddrinfo(addrinfo); } // for socket option if (sock != INVALID_SOCKET){ // set socket option setSocketOption(sock); // check socket option if (outputLog) checkSocketOption(sock); } else { // INVALID_SOCKET if (settings->getOutputLog()){ const QString text = "socketToServer() : sock = INVALID_SOCKET"; emit outputLogMessage(PHASE_DEBUG, text); } } return sock; }
Gesture::Detected Gesture::gestureRejected(QString& reason) { if (_logFileStream) outputLogMessage(false, reason); return Gesture::No; }