目录

  • 一、学习的知识点
  • 基于socket服务器
  • socket函数
  • bind函数
  • listen函数
  • accept函数
  • 二、上课没有听懂或者没有理解的地方
  • 三、当天学习的收获


一、学习的知识点

  1. 每个上网的电脑都有唯一的IP地址
  2. 一个电脑的进程有唯一的端口号(应用层的),进程不跑就没有端口号。
  3. IP端口最多65536个,80端口是网页端口。
  4. IP分为外网IP和内网IP
  5. 网关是路由器的IP地址
  6. DNS域名解析 服务器,将域名如 baidu.com 解析成 点分十进制 的格式
  7. 实时通信,socket通信协议 套接字,还有http ftp ssh通信协议,都是基于TCP/IP或UDP协议栈
  8. TCP更可靠 有3次握手,实时性高
  9. UDP更快,不用握手,但不可靠,基于数据包,会丢失,视频或文件时

基于socket服务器

socket函数

  • 功能:创建一个套接字用于通信
  • 原型:int socket(int domain,int type,int protocol);
  • 参数:
  • domain: 指定通信协议族 如AF_INET IPV4协议
  • type: 指定socket类型,SOCK_STREAM 流式套接字,SOCK_DGRAM数据报套接字,SOCK_RAW 原始套接字
  • protocol: 协议类型 IPPRCTO_TCP 表示IP协议栈的TCP协议
  • 返回值:套接口描述字,与文件描述符类似,简称套接字。失败返回 -1

bind函数

  • 功能:绑定一个本地地址到套接字
  • 原型:int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
  • 参数:
  • sockfd: socket函数返回的套接字
  • addr: 要绑定的地址
  • addrlen: 地址长度
  • 返回值:成功返回0,失败返回 -1

listen函数

  • 功能:将套接字用于监听接入的连接
  • 原型:int listen(int sockfd,int backlog);
  • 参数:
  • sockfd: socket函数返回的套接字
  • backlog: 规定内核为此套接字排队的最大连接个数,完成三次握手的和未完成三次握手(只完成一次或两次)的数量不能超过 backlog。SOMAXCONN 128
  • 返回值:成功返回0,失败返回 -1

accept函数

连接成功后取走 listen 中完成三次握手的队列对应客户端的数据

  • 功能:从已完成连接队列返回第一个连接,若已完成连接队列为空,则阻塞
  • 原型:int accept(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
  • 参数:
  • sockfd: 服务器套接字
  • addr: 将返回对等方的套接字地址
  • addrlen: 返回对等方的套接字地址长度
  • 返回值:成功返回客户端文件描述符,失败返回 -1
int main()
{
	//1. 创建一个套接字
	int socket_fd = socket(AF_INET, SOCK_STREAM, 0); //AF_INET ipv4  SOCK_STREAM流式套接字
	if (socket_fd == -1)
		ERR_EXIT("socket");
	//2. 绑定IP和端口
	struct sockaddr_in ser_add;
	ser_add.sin_family = AF_INET;
	ser_add.sin_port = htons(8091); //把8090端口号转换成网络字节序
	ser_add.sin_addr.s_addr = htonl(INADDR_ANY); //本机的测试ip 127.0.0.1 或本机真正ip 
	//inet_aton("192.168.", &ser_add.sin_addr);或者真正ip
	int ret = bind(socket_fd, (struct sockaddr*)&ser_add, sizeof(ser_add));//绑定服务器的IP
	if (ret == -1)
		ERR_EXIT("bind");
	//setsockopt(socket_fd, SOL_SOCKET, SO_REUSEPORT, (char*)&ser_add, sizeof(ser_add)); 端口复用
	ret = listen(socket_fd, SOMAXCONN);//3. 监听的时候,设置已经完成三次握手的客户端的个数的最大值
	if (ret == -1)
		ERR_EXIT("listen");

	struct sockaddr_in cli_add; //客户端结构体
	socklen_t add_len = sizeof(cli_add);
	//4. 如果没有客户端完成三次握手,程序会阻塞在accept
	cout << "wait" << endl;
	int con_fd=accept(socket_fd, (struct sockaddr*)&cli_add, &add_len); //接收 成功返回用于通信的fd
	if (con_fd == -1)
		ERR_EXIT("accept");
	cout << "someone on line..." << endl;
	char buf[64] = { 0 };
	read(con_fd,buf,64);
	cout << buf << endl;
	//nc 127.0.0.1 8091
	/*
	客户端
	int ret=0;
	int sockfd=socket(AF_INET,SOCK_STREAM,0)
	
	struct sockaddr_in addr;
	addr.sinfamily=AF_INET;
	addr.sin_port=htons(8090);
	inet_aton("192.168.254.132",addr.sin_addr);
	ret=connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));
	if(ret!=0)
	{
	}
	cout << "connect success" << endl;
	read(sockfd,"hello omo",64);
	*/

	return 0;
}

二、上课没有听懂或者没有理解的地方

三、当天学习的收获

进程间通信-共享内存、socket服务器