CSAPP-Network

socket

upload sucsful

socket address structures

upload suful

filename aly exists, renamed

发明套接字接口的时候,还没有void*,为了兼容,可以定义套接字函数要求一个指向通用sockaddr结构的指针,然后要求应用程序将与协议特定的结构的指针强制转换成这个通用的结构。

socket Interface

upload succesl

1.开启服务器

  • (open_listenfd函数,做好接收请求的准备)
  • socket
  • bind
  • listen
  • accept

2.开启客户端

  • getaddrinfo
  • socket
  • connect
  1. 交换数据

4.关闭客户端

5.断开客户端

getaddrinfo:

设置服务器的相关信息

socket

创建socket descriptor ,也就是之后用来读写的file descriptor

upload cessful

bind

请求kernel把socket address 和 socket descriptor绑定

Bind is kernel call to designate which service this program will be hosting

告诉内核将addr中的服务器套接字地址和套接字描述符sockfd联系起来,对于socket和connect,最好方法是用getaddrinfo来为bind提供参数

filename alrey exists, renamed

listen

由于客户端是发起连接要求的主动实体,服务器是被动等待连接请求的,所以默认条件下,内核会认为socket函数创建的描述符对应于主动套接字,它存在于一个连接的客户端。服务器调用listen函数告诉内核,描述符是被服务器而不是客户端使用的。

也就是说listen函数把sockfd从一个主动套接字转化为一个监听套接字,这个套接字可以接受来自客户端的连接请求。

upload succeul

accept

等待来自客户端的连接请求到达listenfd,然后在addr中填写客户端的套接字地址,并且返回一个已连接描述符,这个描述符可以用来利用Unix I/O 函数与客户端通信。

upload succeul

filename ady exists, renamed

connect (client side)

connect 函数试图与套接字地址为addr的服务器建立一个因特网链接,其中addrlen是sizeof(sockaddr_in)connect函数会阻塞,一直到连接成功或者发现错误。

uploessful

diff of connected & listening descriptors

upload successful

getaddrinfo

upload succesl

Host and service connection

uload successful

result 指向addrinfo结构的链表

getnameinfo

upload succesul

LLR by getinfo

upload sussful

addrinfo struct(代码实现)

upload succel

以下函数是用来把域名转化为IP地址的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int main(int argc,char **argv){

struct addrinfo *p,*listp,hints;
char buf[MAXLINE];
int rc,flags;

if(argc!=2){
fprintf(stderr,"usage: %s <domain name>\n",argv[0]);
exit(0);
}

//get a list of addinfo records
memset(&hints,0,sizeof(struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
if((rc=getaddrinfo(argv[1],NULL,&hints,&listp))!=0){
fprintf(stderr,"getaddrinfo error: %s\n",gai_strerror(rc));
exit(1);
}

flags = NI_NUMERICHOST;

for(p=listp;p;p = p->ai_next){
Getnameinfo(p->ai_addr,p->ai_addrlen,buf,MAXLINE,NULL,0,flags);
printf("%s\n",buf);
}

Freeaddrinfo(listp);

exit(0);
}

Web

upload sssful

web server return content to clients,in 2 different ways:

1.取磁盘文件,并把他的内容返回给客户端,磁盘文件称为静态内容,返回文件给客户端叫服务静态内容。

2.运行一个可执行文件,把输出返回给客户端,运行的时候输出内容叫做动态内容,而运行程序并返回输出内容叫做服务动态内容。

web服务器返回的内容都是和它管理的某个文件相关联的,这些文件中的每一个都有一个唯一的名字叫URL,通用资源定位符。

HTTP

超文本传输协议

CGI

通用网关接口,用来处理服务器向客户端提供动态内容的问题