C ++ - الخادم البسيط الذي يرسل HTML بسيطة للعملاء

StackOverflow https://stackoverflow.com/questions/873978

  •  22-08-2019
  •  | 
  •  

سؤال

والآن، أنا مجرد العبث مع هذا وأنا لست متأكدا لماذا لم يكن هذا العمل.

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <cassert>

const char html[] = "HTTP/1.1 200 OK\r\n"
"Connection: close\r\n"
"Content-type: text/html\r\n"
"\r\n"
"<html>\r\n"
"<head>\r\n"
"<title>Hello, world!</title>\r\n"
"</head>\r\n"
"<body>\r\n"
"<h1>Hello, world!</h1>\r\n"
"</body>\r\n"
"</html>\r\n\r\n";

int main() {
    WSADATA wsa;

    assert( WSAStartup( MAKEWORD( 2, 2 ), &wsa ) == 0 );

    addrinfo *res = NULL;
    addrinfo hints;

    ZeroMemory( &hints, sizeof( hints ) );

    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    assert( getaddrinfo( NULL, "80", &hints, &res ) == 0 );

    SOCKET s = socket( res->ai_family, res->ai_socktype, res->ai_protocol );

    assert( s != INVALID_SOCKET );
    assert( bind( s, res->ai_addr, (int)res->ai_addrlen ) != SOCKET_ERROR );
    assert( listen( s, SOMAXCONN ) != SOCKET_ERROR );

    SOCKET client = accept( s, NULL, NULL );

    assert( client != INVALID_SOCKET );

    char buffer[512];
    int bytes;

    bytes = recv( client, buffer, 512, 0 );

    for ( int i = 0; i < bytes; ++i ) {
        std::cout << buffer[i];
    }

    assert( send( client, html, strlen( html ) - 1, 0 ) > 0 );
    assert( shutdown( client, SD_BOTH ) != SOCKET_ERROR );

    closesocket( client );
    WSACleanup();

    return 0;
}

عند I تجميع وتشغيل هذا ثم انتقل إلى 127.0.0.1 في متصفحي أحصل على هذا في وحدة بلدي:

<اقتباس فقرة>   

وGET / HTTP / 1.1

     

والمضيف: 127.0.0.1

     

والاتصال: المحافظة على الحياة

     

وعامل المستخدم: موزيلا / 5.0 (ويندوز، U، ويندوز NT 5.1، اون US) AppleWebKit / 530.5 (K HTML، مثل أبو بريص) كروم / سفاري 2.0.172.8 / 530.5

     

وذاكرة التخزين المؤقت-التحكم: الحد الأقصى للسن = 0

     

وقبول: التطبيق / أكس، والتطبيق / XHTML + XML، والنص / أتش تي أم أل، ف = 0.9، نص / عادي، ف = 0.8، صورة / بابوا نيو غينيا، <م> / ، ف = 0.5

     

وتحمل ترميز: غزيب، فرغ، BZIP2، SDCH

     

وقبول اللغة: EN-US، أون، ف = 0.8

     

وتحمل-محارف: ISO-8859-1، UTF-8؛ ف = 0.7 *؛ ف = 0.3

تعديل - يمكنك لقد تحديث HTML أنا الإرسال. لقد اختبرت هذا مع موزيلا فايرفوكس وجوجل كروم ويعمل في فايرفوكس، ولكن ليس الكروم!

تعديل 2 - يمكنك لذا يبدو أن سبب ذلك كان يعمل على فايرفوكس، ولكن ليس كروم، كان لفايرفوكس يعرض HTML كما وردت، في حين ينتظر كروم للاتصال ليغلق قبل القيام بأي استدعاء. وأضاف لي رمز لإغلاق مأخذ وأنه يعمل. لقد تحديث قانون بلدي مع مصدر العمل.

هل كانت مفيدة؟

المحلول

وتحتاج إلى إرسالها مرة أخرى في سطر الحالة:

وHTTP / 1.1 200 OK

والسابقة رؤوس ردكم.

وانظر عازف الكمان (www.fiddler2.com) للحصول على فكرة أفضل عن ما تبدو استجابات HTTP الصحيح مثل.

وفيما يتعلق الخاص بك في وقت لاحق تحرير، جميع المتصفحات الانتظار لفترة معينة من البيانات قبل البدء في تقديم. الحد الكروم يختلف من لفايرفوكس. إذا كنت قد وضعت على طول محتوى أو تستخدم ترميز HTTP المقسم، فإن رأيتم السلوك السليم.

نصائح أخرى

وانظروا النمس http://code.google.com/p/mongoose/ انها مكتبة قائمة بذاتها وهذا هو مؤشرات HTTP خادم الويب، ولها واجهة برمجة التطبيقات فائقة بسيط (يكتمل بعد). في غضون بضع دقائق كنت قادرا على ربط لبلدي التطبيق موجود بالفعل.

وكان لي نفس السؤال في وقت سابق من اليوم (لإعطاء بلدي C ++ التطبيق نهاية الويب) <وأ href = "https://stackoverflow.com/questions/873615/giving-c-application-a-http-web-server -functionality "> إعطاء C ++ تطبيق وظيفة خادم ويب HTTP

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top