目录:
1 tcp编程基础
2 udp编程基础
3 socket
4 sigio信号以及信号工作流程
5 io多路复用(select,poll,select)
1 简单的tcp服务器编程流程:
服务器流程: socket(), 构建地址,绑定bind(),监听listen(),接收accept(), 数据处理(recv/sned),关闭close
客户端流程:socket(),构建地址,连接connect(),数据处理(send/recv),关闭close
注:三次握手是在accept前就完成。
2 简单udp服务器编程流程:
服务器流程:socket(),recvfrom(fd, addr, buffer,length,0)/sendto(),关闭close
客户端流程:socket(),sendto/recvfrom,close
对于recvfrom不仅能接收数据,还能获取到发送者的地址
udp也可以实现并发。无法通过应用协议标记。而是只能仿照tcp三次握手实现并发。音视频应用较多。udp编程没有复杂的三次握手,四次挥手而省电.大概可以实现10K Level并发
tcp/udp可理解成客户酒店吃饭问题:
人就是fd。对于服务器首先socket()创建一个迎宾员,bind(ip)将迎宾员绑定在那个门,listen()就是迎宾员站在门口等待客人到来店里来吃饭。当有客户到来时候,迎宾员就接收进酒店accept产生一个新的fd(找到一个对应的服务员clientfd)服务客户点菜上酒买单等操作,后面这个客户的所有服务器就跟迎宾员无关了。而对于udp服务器而言:相当于小餐馆,迎宾员和服务员是同一个人。
3 socket含义:
socket网络套接字,其实就是一个数字,或者说称为文件描述符,fd都可以。
socket()函数其实就跟open函数一样打开一个文件,也是拥有io的一些属性。
socket英文单词是插座的意思: fd<----->五元组(sip,sport,dip,dport,协议)
fd加上五元组就是一个socket
4 sigio信号以及信号工作流程
4.1 sigio信号无实际开发意义,主要活在实验室,很难在开源代码中看到。接收到一帧数据应用程序就收到一个sigio信号。
对于udp而言,a) 当网卡接收到一帧数据通知操作系统,b) 再由操作系统的内核网络协议栈向应用程序发送sigio消息。c)应用程序收到sigio消息然后处理对应绑定的回调函数
对于tcp来讲,tcp理论是可行的,实际上不行的,tcp处理的时候,sigio会很多。
具体代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
int sockfd = 0;
void do_sigio(int sig) {
struct sockaddr_in cli_addr;
int clilen = sizeof(struct sockaddr_in);
int clifd = 0;
#if 0 //tcp
clifd = accept(sockfd, (