目录
- 一、学习的知识点
- 基于socket服务器
- socket函数
- bind函数
- listen函数
- accept函数
- 二、上课没有听懂或者没有理解的地方
- 三、当天学习的收获
一、学习的知识点
- 每个上网的电脑都有唯一的IP地址
- 一个电脑的进程有唯一的端口号(应用层的),进程不跑就没有端口号。
- IP端口最多65536个,80端口是网页端口。
- IP分为外网IP和内网IP
- 网关是路由器的IP地址
- DNS域名解析 服务器,将域名如 baidu.com 解析成 点分十进制 的格式
- 实时通信,socket通信协议 套接字,还有http ftp ssh通信协议,都是基于TCP/IP或UDP协议栈
- TCP更可靠 有3次握手,实时性高
- 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服务器