दिलचस्प पोस्ट
JQuery के साथ गतिशील रूप से पंक्तियां जोड़ना एक <select> तत्व के लटकती तीर को छिपाने के लिए सही "-मोझ-उपस्थित" मान क्या है MySQL में एकाधिक तालिकाओं से कैसे हटाना है? जावा और एक्सएमएल में कस्टम घटक मापदंडों को कैसे पारित करें जावा में चर कास्टिंग करना निर्भरता इंजेक्शन – एक क्लास विधियों में से कई में आवश्यक नए उदाहरण कन्वर्टर कन्स्ट्रक्टर की जगह कन्वर्टर कन्स्ट्रक्टर क्यों है? ASP.NET MVC बीटा में आईपी पते द्वारा एक विशिष्ट नियंत्रक तक पहुंच प्रतिबंधित करें जावास्क्रिप्ट के साथ छवि डाउनलोड करें डी 3 नोड लेबलिंग जाँच करें कि चेकबॉक्स की जाँच की गई है जावास्क्रिप्ट निष्पादक सेवा, समाप्त करने के लिए सभी कार्यों का इंतजार कैसे करें पर्ल की छिपी हुई विशेषताओं? मैं zlib के साथ एक gzip स्ट्रीम कैसे दबाव डाल सकता हूँ? जेएसएलआईंट ने रिपोर्ट किया है "असुरक्षित ^" मेरे रेगेक्स के लिए – इसका क्या अर्थ है?

Winsock के साथ चुने गए HTTP डेटा प्राप्त करना

मुझे कुछ चुने गए HTTP प्रतिक्रिया डेटा में पढ़ने में समस्या आ रही है winsock का उपयोग कर मैं एक अनुरोध ठीक भेजता हूं और निम्नलिखित पीठ प्राप्त करता हूं:

HTTP/1.1 200 OK Server: LMAX/1.0 Content-Type: text/xml; charset=utf-8 Transfer-Encoding: chunked Date: Mon, 29 Aug 2011 16:22:19 GMT 

winsock recv का उपयोग करना इस बिंदु पर हालांकि यह सिर्फ लटका हुआ है। मेरे पास एक अनंत लूप में चलने वाले श्रोता हैं लेकिन कुछ भी नहीं उठाया गया है।

मुझे लगता है कि यह सी ++ मुद्दा है, लेकिन यह इस तथ्य से भी संबंधित हो सकता है कि मैं कनेक्शन के माध्यम से सुरंग के माध्यम से इसे HTTPS के अंदर लपेटकर रखता हूं। मेरे पास सी # में कुछ लिब्ज़ का प्रयोग करने वाला टेस्ट एप्लिकेशन है जो स्टैनल के माध्यम से पूरी तरह से काम करता है। मुझे इस बात के रूप में उलझन में है कि शुरुआती आरईसी के बाद मेरी पाश सी + + कांटेदार डेटा क्यों नहीं प्राप्त कर रहा है।

यह प्रश्न में लूप है … इसे ऊपर की ओर से ठीक ठीक प्रतिक्रिया के बाद कहा जाता है …

 while(true) { recvBuf= (char*)calloc(DEFAULT_BUFLEN, sizeof(char)); iRes = recv(ConnectSocket, recvBuf, DEFAULT_BUFLEN, 0); cout << WSAGetLastError() << endl; cout << "Recv: " << recvBuf << endl; if (iRes==SOCKET_ERROR) { cout << recvBuf << endl; err = WSAGetLastError(); wprintf(L"WSARecv failed with error: %d\n", err); break; } } 

कोई विचार?

वेब के समाधान से एकत्रित समाधान "Winsock के साथ चुने गए HTTP डेटा प्राप्त करना"

आपको अपना पठन कोड बदलना होगा। आप एक निश्चित-लंबाई वाले बफर का उपयोग करते हुए chunked डेटा पढ़ सकते हैं जैसे आप करने की कोशिश कर रहे हैं डेटा को चर-लंबाई खंड में भेजा जाता है, जहां प्रत्येक समूह में एक शीर्षलेख होता है जो बाइट्स में चक की वास्तविक लंबाई को निर्दिष्ट करता है, और डेटा का अंतिम हिस्सा 0 की लंबाई है। आपको क्रमबद्ध शीर्षलेखों को पढ़ने की आवश्यकता है विखंडू को ठीक से संसाधित करें कृपया आरएफसी 2616 अनुभाग 3.6.1 पढ़ें। आपके तर्क को निम्न छद्म कोड की तरह होना चाहिए:

 send request; status = recv() a line of text until CRLF; parse status as needed; response-code = extract response-code from status; do { line = recv() a line of text until CRLF; if (line is blank) break; store line in headers list; } while (true); parse headers list as needed; if ((response-code is not in [1xx, 204, 304]) and (request was not "HEAD")) { if (Transfer-Encoding header is present and not "identity") { do { line = recv a line of text until CRLF; length = extract length from line; extensions = extract extensions from line; process extensions as needed; // optional if (length == 0) break; recv() length number of bytes into destination buffer; recv() and discard bytes until CRLF; } while (true); do { line = recv a line of text until CRLF; if (line is blank) break; store line in headers list as needed; } while (true); re-parse headers list as needed; } else if (Content-Length header is present) { recv() data into destination buffer up to Content-Length number of bytes; } else if (Content-Type header starts with "multipart/") { recv() data into destination buffer until MIME terminator derived from the Content-Type's "boundary" attribute value is reached; } else { recv() data into destination buffer until disconnected; } } 

दरअसल आपको टुकड़े टुकड़े नहीं मिलता, लेकिन सामग्री का टुकड़ा है। आपको अपने लिए एक तस्वीर खींचना है कि आपको कोई बफ़र कैसे प्राप्त होता है। ऐसा नहीं है कि आप समय पर एक हिस्सा प्राप्त करते हैं। कभी-कभी आपके पास पिछले हिस्से का कुछ डेटा होता है, लाइन जो नए चक के आकार का संकेत देती है, कुछ चक डेटा के बाद। कुछ अन्य समय आप सिर्फ चक डेटा का थोड़ा सा प्राप्त करते हैं एक और समय का एक हिस्सा चक डेटा और नया हिस्सा, आदि, आदि का संकेत देकर लाइन का एक हिस्सा। सबसे खराब केस परिदृश्यों की कल्पना करें, यह आसान नहीं है। इसे पढ़ें: http://www.jmarshall.com/easy/http/

इससे पहले कि आप खाली कोड का उपयोग कर सकें, खाली शीर्षक तक सभी हेडर प्राप्त करें। जहां सामग्री बफर में शुरू होती है nContentStart कोड कुछ इन-हाउस क्लासेस का उपयोग करता है जिसे मैं साझा नहीं कर सकता, लेकिन आपको यह विचार प्राप्त करना चाहिए;) जहां तक ​​मैंने परीक्षण किया, यह अपेक्षित काम करता है और स्मृति को रिसाव नहीं करता। यद्यपि यह आसान नहीं है, मैं पूरी तरह से सुनिश्चित नहीं हो सकता!

  if (bChunked) { int nOffset = nContentStart; int nChunkLen = 0; int nCopyLen; while (true) { if (nOffset >= nDataLen) {pData->SetSize(0); Close(); ASSERTRETURN(false);} // copy data of previous chunk to caller's buffer if (nChunkLen > 0) { nCopyLen = min(nChunkLen, nDataLen - nOffset); n = pData->GetSize(); pData->SetSize(n + nCopyLen); memcpy(pData->GetPtr() + n, buf.GetPtr() + nOffset, nCopyLen); nChunkLen -= nCopyLen; ASSERT(nChunkLen >= 0); nOffset += nCopyLen; if (nChunkLen == 0) nOffset += strlen(lpszLineBreak); ASSERT(nOffset <= nDataLen); } // when previous chunk is copied completely, process new chunk if (nChunkLen == 0 && nOffset < nDataLen) { // chunk length is specified on first line p1 = buf.GetPtr() + nOffset; p2 = strstr(p1, lpszLineBreak); while (!p2) // if we can't find the line break receive more data until we do { buf.SetSize(nDataLen + RECEIVE_BUFFER_SIZE + 1); nReceived = m_socket.Receive((BYTE*)buf.GetPtr() + nDataLen, RECEIVE_BUFFER_SIZE); if (nReceived == -1) {pData->SetSize(0); Close(); ASSERTRETURN(false);} // connection error if (nReceived == 0) {pData->SetSize(0); Close(); ASSERTRETURN(false);} // all data already received but did not find line break nDataLen += nReceived; buf[nDataLen] = 0; p1 = buf.GetPtr() + nOffset; // address of buffer likely changed p2 = strstr(p1, lpszLineBreak); } *p2 = 0; p2 += strlen(lpszLineBreak); p3 = strchr(p1, ';'); if (p3) *p3 = 0; if (sscanf(p1, "%X", &nChunkLen) != 1) {pData->SetSize(0); Close(); ASSERTRETURN(false);} if (nChunkLen < 0) {pData->SetSize(0); Close(); ASSERTRETURN(false);} if (nChunkLen == 0) break; // last chunk received // copy the following chunk data to caller's buffer nCopyLen = min(nChunkLen, buf.GetPtr() + nDataLen - p2); n = pData->GetSize(); pData->SetSize(n + nCopyLen); memcpy(pData->GetPtr() + n, p2, nCopyLen); nChunkLen -= nCopyLen; ASSERT(nChunkLen >= 0); nOffset = (p2 - buf.GetPtr()) + nCopyLen; if (nChunkLen == 0) nOffset += strlen(lpszLineBreak); if (nChunkLen == 0 && nOffset < nDataLen) continue; // a new chunk starts in this buffer at nOffset, no need to receive more data } // receive more data buf.SetSize(RECEIVE_BUFFER_SIZE + 1); nDataLen = m_socket.Receive((BYTE*)buf.GetPtr(), RECEIVE_BUFFER_SIZE); if (nDataLen == -1) {pData->SetSize(0); Close(); ASSERTRETURN(false);} if (nDataLen == 0) {pData->SetSize(0); Close(); ASSERTRETURN(false);} buf[nDataLen] = 0; nOffset = 0; } // TODO: receive optional footers and add them to m_headers }