wsxk / wsxk.github.io

MIT License
5 stars 0 forks source link

Building a Web Server #191

Open wsxk opened 3 months ago

wsxk commented 3 months ago

https://wsxk.github.io/web_basic_2/

前言

  1. 构建web server所需的system call与结构体

    1.1 用汇编来实现上述步骤

前言 要想构建一个简单的web server,最简单的办法当然是使用python辣,但是为了能够更清楚的了解web server的运行原理,在linux上用assembly是最合适的~ 首先需要了解的一点是:web server是构建在linux操作系统上的应用程序,其与外界进行互动时,需要让linux操作系统来充当中介

  1. 构建web server所需的system call与结构体 int socket( int domain, //socket() creates an endpoint for communication
    int type, //and returns a file descriptor int protocol //that refers to that endpoint. )

int bind( int sockfd, //When a socket(2) is created with socket, struct sockaddr *addr, //it exists in a name space (address family) but has no address assigned to it. socklen_t addrlen//bind() assigns the address specified by addr to the socket referred to by the file descriptor sockfd. )

这里出现了关键的结构体: struct sockaddr { uint16_t sa_family; uint8_t sa_data[14]; }; // sockaddr结构体用来描述一个网络连接还是太粗糙了,于是有了下面的改进版本 struct sockaddr_in { uint16_t sin_family; uint16_t sin_port; uint32_t sin_addr; uint8_t __pad[8]; } // 可以看到sockaddr_in和sockaddr本质上是一个东西,只不过sockaddr_in划分结构体成员更加精细

int listen( int sockfd, //listen() marks the socket referred to by sockfd as a passive socket, int backlog//that is, as a socket that will be used to accept incoming connection requests using accept(2). )

int accept( int sockfd, //The accept() system call is used with connection-based socket types (SOCK_STREAM, SOCK_SEQPACKET). struct sockaddr addr,//It extracts the first connection request on the queue of pending connections for the listening socket, sockfd, socklen_t addrlen//creates a new connected socket, and returns a new file descriptor referring to that socket. )

一般服务器接收请求的步骤如下: socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3 bind(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr(

SuzumiyaAsahi commented 2 months ago

我去,这么横吗?用汇编实现

wsxk commented 2 months ago

@SuzumiyaAsahi 我去,这么横吗?用汇编实现

只具有基本的http应答的功能就是了,hhh