KMError WSConnection_V1::connect_i(const std::string& ws_url) { Uri uri; if (!uri.parse(ws_url)) { return KMError::INVALID_PARAM; } std::string http_url; if(is_equal("wss", uri.getScheme())) { http_url = "https://"; } else { http_url = "http://"; } http_url += uri.getHost(); auto const &str_port = uri.getPort(); if (!str_port.empty()) { http_url += ":" + str_port; } http_url += uri.getPath(); auto const &str_query = uri.getQuery(); if(!str_query.empty()){ http_url += "?"; http_url += str_query; } addHeader(strUpgrade, "websocket"); addHeader("Connection", "Upgrade"); addHeader(strHost, uri.getHost()); if (!origin_.empty()) { addHeader("Origin", origin_); } addHeader(kSecWebSocketKey, "dGhlIHNhbXBsZSBub25jZQ=="); if (!subprotocol_.empty()) { addHeader(kSecWebSocketProtocol, subprotocol_); } if (!extensions_.empty()) { addHeader(kSecWebSocketExtensions, extensions_); } addHeader(kSecWebSocketVersion, kWebSocketVersion); setState(State::UPGRADING); auto ret = stream_->sendRequest("GET", http_url, "HTTP/1.1"); if (ret != KMError::NOERR) { onStateError(ret); } return ret; }
// 멀티스레드를 위한 imageRequset void imageRequset(string tempuri, int index) { int resp_leng; string request, response; char buffer[BUFFERSIZE]; struct sockaddr_in serveraddr; int sock = 0; WSADATA wsaData; vector<char> image; Uri *uri = new Uri; Uri resultURL = uri->Parse(tempuri); resultURL.Parse(tempuri); if (resultURL.getProtocol() == "http" || resultURL.getProtocol() == "") { hostent* hostname = gethostbyname(resultURL.getHost().c_str()); // Init WinSock WSADATA wsa_Data; int wsa_ReturnCode = WSAStartup(0x101, &wsa_Data); // Get the local hostname struct hostent *host_entry; host_entry = gethostbyname(resultURL.getHost().c_str()); char * ipaddress; ipaddress = inet_ntoa(*(struct in_addr *)*host_entry->h_addr_list); WSACleanup(); int port = 0; if (resultURL.getPort() == "") { port = 80; } else { port = atoi(resultURL.getPort().c_str()); } string path = resultURL.getPath(); if (resultURL.getHost() == "sang12456.cafe24.com") request = "GET " + path + " HTTP/1.1\r\n\r\n"; else request = "GET " + path + " HTTP/1.1\nHost: " + resultURL.getHost() + "\r\n\r\n";//"\nConnection : keep - alive\nCache - Control : max - age = 0\nAccept : text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, */*;q=0.8\nUpgrade-Insecure-Requests: 1\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36\nAccept-Encoding: gzip, deflate, sdch\nAccept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4\r\n\r\n"; //init winsock if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) return; //open socket if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) return; //connect memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr(ipaddress); serveraddr.sin_port = htons(port); if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) return; //send request if (send(sock, request.c_str(), request.length(), 0) != request.length()) return; //get response //cout << "response" << endl; response = ""; resp_leng = BUFFERSIZE; do { resp_leng = recv(sock, (char*)&buffer, BUFFERSIZE, 0); copy(buffer, buffer + resp_leng, back_inserter(image)); } while (resp_leng != 0); //disconnect closesocket(sock); //cleanup WSACleanup(); } else response = "not valid"; if (image[9] == '2' && image[10] == '0' && image[11] == '0') { int imageLen = image.size(); char *binary = new char[imageLen]; memset(binary, 0, imageLen); int j = 0; for (unsigned int k = 0; k < image.size(); k++) { binary[j] = image[k]; j++; } // 임계영역 mtx.lock(); char *temp; if ((temp = strstr(binary, "\n\n")) != NULL) { images.insert(pair<int, char*>(index, &temp[2])); imagecache.insert(pair<string, char*>(tempuri, &temp[2])); } else if ((temp = strstr(binary, "\r\n\r\n")) != NULL) { images.insert(pair<int, char*>(index, &temp[4])); imagecache.insert(pair<string, char*>(tempuri, &temp[4])); } imagecacheSize.insert(pair<string, int>(tempuri, image.size())); replace(ret, tempuri+"\"image", "image"); imageSize.insert(pair<int, int>(index, image.size())); mtx.unlock(); InvalidateRect(hwndMain, &rt, TRUE); } }