第一部分感觉内容比较多,但感觉解释并不多,我就把看到的理解了的记录下来,等晚点再来添砖加瓦。
- socket是每一个网络连接的端点,是一个特殊的文件
- 课本首先举例:建立TCP socket连接的流程,如一个非并发C/S获取时间的结构
- 客户端:发送请求,读数据
#include "unp.h" //包含大量socket头文件
int main(int argc, char **argv){
int sockfd, n;
char recvline[MAXLINE+1];
struct sockaddr_in servaddr; //创建一个sockaddr_in结构体对象, 为服务器地址
// 该结构体内部包含:sin_family, sni_port等
if(argc!=2) err_quit("usage: a.out <IPaddress>") //如果参数个数不等于2, 声明一下程序调用方法
if((sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0) err_sys("socket error") // 创建fd失败,AF_INET代表网络,用于指定套接字通信的地址类型(如IPV4),SOCK_STREAM则代表接受数据类型是字节流
bzero(&servaddr, sizeof(servaddr)); //等价memset(servaddr, 0, sizeof(servaddr)),将servaddr所有字节置零
servaddr.sin_family = AF_INET; //指定协议类型
servaddr.sin_port = htons(13); //指定连接端口,13代表时间端口
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) err_quit("inet_pton error for %s", argv[1]); //argc[1]是第二个参数,即IP地址,那inet_pton是什么?好像是给sin_addr赋值IP地址
if(connect(sockfd, (SA*) &servaddr, sizeof(servaddr)) < 0) err_sys("connect error"); //TCP连接开始建立,注意传入三个参数,sockfd代表连服务端连接端点的文件描述符,servaddr代表服务端地址,
while((n = read(sockfd, recvline, MAXLINE)) > 0){
// 从fd的recvline开始不断读取数据,直到MAX_LINE
//用while的原因是,TCP数据包是连续的,一次读取很难将所有数据读取出来,因此在这里需要使用while进行读取。
recvline[n] = 0;
if(fputs(recvline, stdout)==EOF) err_sys("fput error");
}
if(n < 0) err_sys("read_error");
exit(0); // 关闭连接
}
#include "unp.h"
#include <time.h>
int main(int argc, char** argv){
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(13);
Bind(listenfd, (SA*) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for(;;){
connfd = Accept(listenfd, (SA*) NULL, NULL); //此时应该会阻塞,要么就是轮询,直到fd有数据
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n"m ctime(&ticks));
Close(connfd);
}
}
上述C/S模型面临的最大缺点
- 不能达到协议无关
- 利用getaddrinfo函数获取地址信息,从而让代码可以自动根据协议选择结构与函数
- 传递参数必须是IP而不能是域名,可以加入DNS解析机制解析域名得到IP,通过服务名与端口转换函数得到端口号 - 不能并发处理,在面对多用户的情况不可取。
疑惑
- 面试常问的问题是,TCP四次挥手之后,由于连接断开需要2MSL确认时间,导致大量端口被占用,这些端口指的是fd吗?那每个服务器端口上限是多少(fd是short int类型,那是65535吗)?
- htons和htonl,(host to net short/long) 是将主机的小端字节序转为网络的大端字节序,为什么网络字节序和主机字节序不一样呢?
- AF_INET协议簇包含那些协议?