The simplest HTTP server implementation

xiaoxiao2021-03-06  124

There are now a lot of powerful HTTP servers, Apache, IIS, we should be familiar with

In fact, many HTTP servers have the most basic workflow:

1. Initialize the working environment, listen to external requests in fixed port (80)

2. Receive request

3. Establish a connection

4. Send a response header

5. Send a response

6. Interrupt connection

Here is the simplest HTTP server example, with Winsock implementation

Why is the easiest thing because it receives the request, the response header and response content sent are directly specified.

Can't distinguish between different GET, POST, and HEAD requests.

#include "winsock.h" #include "stdlib.h" #include "stdio.h" #include "string.h" #pragma Comment (lib, "wsock32") /// required library files required

Void main () {/ initialization Winsock environment WSADATA WSADATA; Word WVersion = MakeWord (2,0); / Winsock 2.0 IF (WSAStartup (WSADATA)! = 0) {Printf ("INITALIZE FAILED! / N"); wsacleanup (); Exit (1);

Int Sock, Csock, Length; // Sock is the server-side listening socket, CSOCK is a client connection socket length = sizeof (struct sockaddr);

struct sockaddr_in server_ipaddr, client_ipaddr; // the client and server for obtaining address information memset (& server_ipaddr, 0, length); server_ipaddr.sin_family = AF_INET; server_ipaddr.sin_port = htons (80); server_ipaddr.sin_addr.s_addr = inet_addr ( " 211.81.55.200 ");

CHAR BUFF [4096]; INT NBUFF;

SOCK = Socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); // Bind IF (Bind (STRUCKADDR *) & Server_IpAddr, Length) == Socket_ERROR) {Printf ("Bind Error / N"); wsacleanup (); EXIT (1);} Listening IF (Listen (Sock, 5) == Socket_ERROR) {Printf ("Listen Error / N"); wsacleanup (); exit (1);}

/ CHAR Headers [1000]; // Save Head / Head Format CHAR HDRFMT [] = "HTTP / 1.0 200 OK / R / N" "Server: MySocket Server / R / N" Date:% S / R / n "" Content-Type: TEXT / HTML / R / N "" Accept-ranges: BYTES / R / N "" Content-length:% D / R / N / R / N "; char * strgmtnow =" 08 / 15/14 22:53:00 gmt "; /// will specify a time wsprintf (headers, hdrfmt, (const char *) strgmtnow, strlen (customhtml)); // To transfer web content char Customhtml [] = " / r / n" " / R / N" </ title> / r / n "" </ head> / r / n "<body> / r / n" "<p align = /" center / "> Welcome to my home page </ p> / r / n" "<h3 align = /" center / "> <a href=/"default.htm/"> Happy World </A> </ h3> / r / n "" <p> end </ p> / r / n "<p> </ p> / r / n" </ body> </ html> / R / n / r / n "; // while (1) {// So after the connection, generate new socket /// used to pass messages with the client CSock = Accept (Sock, (Steruct SockAddr * ) & client_ipaddr, & length); if (csock == socket_error) {Printf ("Listen Error / N"); wsacleanup (); EXIT (1);} nbuff = Recv (CSOCK, BUFF, 4095, 0); BUFF [NBuff, ] = '/ 0'; Printf ("% s", buff); / Sending the header Send (Csock, Headers, Strlen (Headers), 0); / Send Content Send (Csock, CustomHTML, Strlen (Customhtml), 0); / Close this connection closesocket Csock);</p> <p>}</p> <p>}</p></div><div class="text-center mt-3 text-grey"> 转载请注明原文地址:https://www.9cbs.com/read-126790.html</div><div class="plugin d-flex justify-content-center mt-3"></div><hr><div class="row"><div class="col-lg-12 text-muted mt-2"><i class="icon-tags mr-2"></i><span class="badge border border-secondary mr-2"><h2 class="h6 mb-0 small"><a class="text-secondary" href="tag-2.html">9cbs</a></h2></span></div></div></div></div><div class="card card-postlist border-white shadow"><div class="card-body"><div class="card-title"><div class="d-flex justify-content-between"><div><b>New Post</b>(<span class="posts">0</span>) </div><div></div></div></div><ul class="postlist list-unstyled"> </ul></div></div><div class="d-none threadlist"><input type="checkbox" name="modtid" value="126790" checked /></div></div></div></div></div><footer class="text-muted small bg-dark py-4 mt-3" id="footer"><div class="container"><div class="row"><div class="col">CopyRight © 2020 All Rights Reserved </div><div class="col text-right">Processed: <b>0.043</b>, SQL: <b>9</b></div></div></div></footer><script src="./lang/en-us/lang.js?2.2.0"></script><script src="view/js/jquery.min.js?2.2.0"></script><script src="view/js/popper.min.js?2.2.0"></script><script src="view/js/bootstrap.min.js?2.2.0"></script><script src="view/js/xiuno.js?2.2.0"></script><script src="view/js/bootstrap-plugin.js?2.2.0"></script><script src="view/js/async.min.js?2.2.0"></script><script src="view/js/form.js?2.2.0"></script><script> var debug = DEBUG = 0; var url_rewrite_on = 1; var url_path = './'; var forumarr = {"1":"Tech"}; var fid = 1; var uid = 0; var gid = 0; xn.options.water_image_url = 'view/img/water-small.png'; </script><script src="view/js/wellcms.js?2.2.0"></script><a class="scroll-to-top rounded" href="javascript:void(0);"><i class="icon-angle-up"></i></a><a class="scroll-to-bottom rounded" href="javascript:void(0);" style="display: inline;"><i class="icon-angle-down"></i></a></body></html><script> var forum_url = 'list-1.html'; var safe_token = 'HQiDij1s00y_2FXSmgvnEJNTpYrp6_2FvOtRBMU9KRRgI9J_2B9KS7VR4eS7lcnat6gl98N9HfbBH7CbcisoHieA2VTg_3D_3D'; var body = $('body'); body.on('submit', '#form', function() { var jthis = $(this); var jsubmit = jthis.find('#submit'); jthis.reset(); jsubmit.button('loading'); var postdata = jthis.serializeObject(); $.xpost(jthis.attr('action'), postdata, function(code, message) { if(code == 0) { location.reload(); } else { $.alert(message); jsubmit.button('reset'); } }); return false; }); function resize_image() { var jmessagelist = $('div.message'); var first_width = jmessagelist.width(); jmessagelist.each(function() { var jdiv = $(this); var maxwidth = jdiv.attr('isfirst') ? first_width : jdiv.width(); var jmessage_width = Math.min(jdiv.width(), maxwidth); jdiv.find('img, embed, iframe, video').each(function() { var jimg = $(this); var img_width = this.org_width; var img_height = this.org_height; if(!img_width) { var img_width = jimg.attr('width'); var img_height = jimg.attr('height'); this.org_width = img_width; this.org_height = img_height; } if(img_width > jmessage_width) { if(this.tagName == 'IMG') { jimg.width(jmessage_width); jimg.css('height', 'auto'); jimg.css('cursor', 'pointer'); jimg.on('click', function() { }); } else { jimg.width(jmessage_width); var height = (img_height / img_width) * jimg.width(); jimg.height(height); } } }); }); } function resize_table() { $('div.message').each(function() { var jdiv = $(this); jdiv.find('table').addClass('table').wrap('<div class="table-responsive"></div>'); }); } $(function() { resize_image(); resize_table(); $(window).on('resize', resize_image); }); var jmessage = $('#message'); jmessage.on('focus', function() {if(jmessage.t) { clearTimeout(jmessage.t); jmessage.t = null; } jmessage.css('height', '6rem'); }); jmessage.on('blur', function() {jmessage.t = setTimeout(function() { jmessage.css('height', '2.5rem');}, 1000); }); $('#nav li[data-active="fid-1"]').addClass('active'); </script>