CSAPP笔记(第十一章 网络编程01)
第十一章的内容为p677~p713. 分2部分, p677~p699, p700~p713.
摘要
网络
集线器: 主机之间用集线器连接
网桥: 集线器之间用网桥连接
路由器: 不兼容的局域网之间用路由器连接
网络协议: 通过统一协议实现不同网络间的通信
因特网3特性:
- 主机集合被映射为一组32位的IP地址.
- 这组IP地址被映射位一组称为因特网域名(IP)的标识符
- 因特网主机上的进程能够通过连接和其他因特网主机上的进程通信
IP
一个IP地址是一个32位无符号整数
struct in_addr {
uint32_t s_addr;
}
IP地址总是以大端法网络字节顺序存放的.
域名是IP地址的别名, 能够以容易记忆的地址访问. 直到1988年, 域名与IP的映射都是通过一个HOSTS.TXT的文本文件来手工维护的. 后来通过一个而分布到世界范围内的数据库(DNS)来维护的. 域名与IP的映射是多对多的, 一个域名可以对应多个IP, 一个IP也可以对应多个域名.
套接字
一个套接字是连接的一个断点, 由一个因特网地址和一个16位的整数端口组成, 用"地址: 端口"表示.
客户端的端口是临时分配的, 称为临时端口(ephermeral port), 服务器端的是固定端口. 一个连接由它两端的套接字地址唯一确定的, 这对套接字地址叫做套接字对(socket pair), (cliaddr:cliport, servaddr:servport)
struct sockaddr_in {
uint16_t sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
}
struct sockaddr {
uint16_t sa_family;
char sa_data[14];
}
socket函数, 创建一个套接字描述符(socket descriptor), clientfd = Socket(AF_INET, SOCK_STREAM, 0);
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
connect函数, 客户端通过connect来建立和服务器的连接
#include <sys/socket.h>
int connect(int clientfd, const struct sockaddr *addr, socklen_t addrlen);
bind函数, bind, listen, accept, 服务器用它们来和客户端建立连接.
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
listen函数
#include <sys/socket.h>
int listen(int sockfd, int backlog);
accept函数, 服务器通过调用accept等待来自客户端的连接请求.
#include <sys/socket.h>
int accept(int listenfd, struct sockaddr *addr, int *addrlen);
套接字连接的辅助函数
open_clientfd函数, 客户端调用该函数建立与服务器的连接, 成功的话返回描述符, 否则返回-1
#include "csapp.h"
int open_clientfd(char *hostname, char *port);
open_listenfd函数, 服务器创建一个监听描述符, 准备好接收连接请求
#include "csapp.h"
int open_listenfd(char *port);
code
从网上找了段c# socket的代码, csharp socket demo