一。端口号 VS PID
pid 已经能够标识一台主机上的一个唯一一个进程了,为什么还需要端口号?
- 不是所有的进程都需要网络通信,但是所有的进程都需要 pid;
- 系统和网络功能解耦。
另外,一个进程可以绑定多个端口,但一个端口只能被一个进程绑定。
系统内定的端口号【0,1023】一般都要有固定的应用层协议使用,如 http:80,https:443。
二。套接字编程的类型
- 域间套接字编程——同一个机器内
- 原始套接字编程——网络工具
- 网络套接字编程——用户间的网络通信
不同的套接字编程类型的接口需要是相同的。
如同用一个统一的 sockaddr 作为基类,sockaddr_in 和 sockaddr_un 作为子类。使用的时候我们用 if 语句区分具体是什么类型,如同下面这段代码:
if(address->type == AF_INET) { // 网络套接字 } else if(address->type == AF_UNIX) { // 域间套接字 }
为什么操作系统接口设计者在设计的时候不直接使用 void呢,因为那时候 C 语言还没有 void。
三.socket 编程接口
// 创建 socket 文件描述符(TCP/UDP,客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号(TCP/UDP,服务器)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
// 开始监听 socket(TCP,服务器)
int listen(int sockfd, int backlog);
// 接收请求(TCP,服务器)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 建立连接(TCP,客户端)
int ;


