Socket编程原理,思路整理

什么是Socket

socket起源于Unix,根据一切都是文件的思想,socket也可以看作是文件,都可以用open-》read/write-》close 的模式操作。

网络中进程如何进行通信

本地进程通信

a 消息传递 (管道 FIFO 消息队列
b 同步 信号量 互斥量 条件变量 读写锁
c 共享内存
d RPC

网络中如何通信

IP+端口号可以标识一个主机,三元组 ip+协议号+端口 可以表示一个进程进行通信

socket通信过程

在这里插入图片描述
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

服务器端通过bind绑定ip地址和端口号,并使用listen函数对绑定端口进行监听,调用accept阻塞,等待客户端进行连接。如果有客户端(connect)建立连接,先经过三次握手进行连接。 此时客户端进行数据请求,如果没有准备好就会阻塞线程,直到数据准备好,返回数据。客户端read()数据,并经过四次握手结束连接。

Select函数

在同步阻塞模型中,recv会一直阻塞到有套接字上有数据可读,把数据读到buffer里后,recv函数才会返回。这样会导致线程一直被阻塞。程序将会被锁死。这种问题虽然可以通过多线程解决 ,但是如果不断创建线程并且都为长连接的话,资源很快会被耗光。
使用select函数,用户首先将进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达的时候,socket被激活,select函数返回,用户线程进行read操作并继续执行。

int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);```
maxfdp:被监听的文件描述符的总数,它比所有文件描述符集合中的文件描述符的最大值大1,因为文件描述符是从0开始计数的;

readfds、writefds、exceptset:分别指向可读、可写和异常等事件对应的描述符集合。

timeout:用于设置select函数的超时时间,即告诉内核select等待多长时间之后就放弃等待。timeout == NULL 表示等待无限长的时间

timeval结构体定义如下:
struct timeval
{      
    long tv_sec;   /*秒 */
    long tv_usec;  /*微秒 */   
};

poll

和select函数功能差不多,解决了select 最大文件描述符的问题,使用链表来存储,但是包含大量文件描述符的数组复制于用户态和内核态的缺点没有解决

epoll

epoll只需要第一次注册一次,后面的监听就不需要传递文件描述符了,因为epoll是通过内核与用户空间mmap同一块内存,避免了无畏的内存拷贝。epoll不同于select和poll轮询的机制,而是通过每个文件描述符定义的回调函数来实现,只有就绪的fd才会执行回调函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值