构建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.
)
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.
)
https://wsxk.github.io/web_basic_2/
前言
构建web server所需的system call与结构体
1.1 用汇编来实现上述步骤
前言 要想构建一个简单的web server,最简单的办法当然是使用python辣,但是为了能够更清楚的了解web server的运行原理,在linux上用assembly是最合适的~ 首先需要了解的一点是:web server是构建在linux操作系统上的应用程序,其与外界进行互动时,需要让linux操作系统来充当中介
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(