UNIX网络编程学习笔记-第一部分

这篇博客记录了作者学习UNIX网络编程过程中的理解和疑惑,主要聚焦于socket作为网络连接端点的概念,以及C/S模型在并发处理和协议无关性方面的局限。内容包括TCP连接流程、协议无关性的实现、DNS解析机制以及TCP四次挥手后的端口占用问题。同时,作者提出了关于端口上限和字节序转换函数htons/htonl的疑问,并询问AF_INET协议簇包含的协议。

第一部分感觉内容比较多,但感觉解释并不多,我就把看到的理解了的记录下来,等晚点再来添砖加瓦。

  • 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协议簇包含那些协议?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值