asp网站 手机登录,app开发排名公司,哪家网站,多用户 wordpress0voice第一课 https://github.com/0voice
今日学习#xff1a;网络通信IO
网络通信的核心是通过系统提供的socket套接字实现的。socket和c语言中文件操作的本质类似#xff0c;在c语言中#xff0c;通过fopen、fclose、fread、fwrite实现了对文件的操作#xff0c;socket…0voice第一课 https://github.com/0voice
今日学习网络通信IO
网络通信的核心是通过系统提供的socket套接字实现的。socket和c语言中文件操作的本质类似在c语言中通过fopen、fclose、fread、fwrite实现了对文件的操作socket类似于fopen函数创建一个文件即套接字然后可以往该“文件”中写入相关的内容。socket包含三个参数分别是协议族、文件类型和协议返回值为fd类似于fopen中的文件指针通过fd对套接字进行io操作。
#includesys/socket.h //socket所需要的头文件sockfd socket(AF_INET, SOCK_STREAM, 0); 创建了socket后需要将该socket和对应的地址进行绑定通信的本质在于不同的地址之间信息的传送socket提供了一个接口现在还需要该接口和某个具体的网络地址进行绑定才可以实现通信。
#includenetinet/in.h //socketaddr_in 需要的头文件// 地址需要专用的结构体 struct socketaddr_in 来定义
// 其具体结构如下struct sockaddr_in { sin_family; //协议族sin_port; //端口struct in_addr sin_addr; //IP地址
}
struch in_addr{s_addr;
}//在服务器端建立一个socketadd类型的地址
struct socketaddr_in server_addr;
server_addr.family AF_INET; //使用ipv4协议族
server_addr.sin_addr.s_addr htonl(INADDR_ANY); //自动获取本机的IP地址并使用htonl转换格式
server_addr.sin_port htons(2000); //要绑定的端口号使用htons转换 获取到了通信地址和socket的fd后需要将两个进行绑定。
//bind函数
//三个参数// sockfd : 创建socket后反回的fd号即要绑定的“文件”
// servaddr IP地址的指针 注意要把sockaddr_in的指针类型转换为socketaddr指针类型
//size IP地址的大小该参数可以用来判断属于哪个协议族。bind(sockfd, servaddr, size)绑定之后就可以监听该端口的信息了使用listen函数
进入listen之后就可以被连接了
//sockfd: 绑定后监听端口的对应的fd
//backlog确定连接请求队列的长度达到该数量后新的请求不再接受。
listen(sockfd 10) 连接之后可以收到客户端的发送的信息但是无法显示出来所以需要accept函数--用于接收客户端发送的信息
//建立客户端
//返回的新套接字是专门用于和当前连接的客户端通信的
//所有后续的读写操作都需要通过这个新的套接字进行而原来的监听套接字sockfd继续监听新的连接请求。struct sockaddr_in clientaddr;
int clientfd accept(sockfd, (struct sockaddr *)clientaddr, sizeof(clientaddr));accept是阻塞的即它会一直等待直到有客户端连接请求。如果没有请求程序将停留在此函数调用//通过recv()函数来接受信息
//buf指向接收缓冲区的指针用于存储从套接字读取到的数据
//len接收缓冲区的大小以字节为单位。recv() 会尝试最多读取 len 字节的数据
recv(int sockfd, void *buf, size_t len, int flags);
//返回值
//返回实际接收到的字节数ssize_t即读取的数据大小。
//如果返回值为 0表示连接已关闭对于流式套接字。 注意sockfd 和 clientfd 的区别只要bind之后只有一个sockfd代表监听的端口。
但是被监听的端口可能同时有很多客户端发送信息对于每个服务端都需要使用accept来重新建立一个socket套接字来传送信息之后可以基于此fd进行recv和send操作。
int client_fd accept(sockfd, (struct sockaddr *)clientaddr, len);
printf(accept finished!);char buffer[1024];
int count recv(client_fd, buffer, sizeof(buffer), 0);
printf(recv: %s, buffer);
count send(client_fd, buffer, count, 0);
print(send: %d, count);
recv更像是c语言文件操作中的fread而send更像是fwrite函数。 总结
网络io操作的流程如下
首先建立socket的fd号将该fd号与地址和端口进行bind
服务器端可以根据此fd号对这个端口进行listen监听并维系一个连接队列
服务器端使用accept与不同的客户端进行连接连接成功后生成新的socket的fd号根据此fd号对其进行读/写即recv和send操作。 一些心得
今天的课程涉及到了计算机网络里tcp相关的内容操作系统中阻塞相关的内容。这些知识本身并不陌生之前在课堂也都学习过知识点都理解只是上手代码由于不是特别熟悉还是有点吃力的需要每一个函数都要去查包括参数、返回值之类的计划2小时学完其实花了很久来上手大概四小时左右代码的实现看了两遍结合gpt搞懂了。虽然时间久还是很有成就感的。希望越来越熟悉加快学习的速度。