每周工作学习总结(2月最后一周)

1、IOCP和Select模型

IOCP

输入输出完成端口(Input/Output Completion Port,IOCP),多应用与c/s架构网络服务器端,每一个socket绑定一个线程,单独负责通信(使用阻塞模式的socket);缺点是在客户端数量比较大时,需要创建同样多的线程,同时在线程不同线程处理数据切换时会消耗大量的资源

Selcet模型

在客户端规模较小时(小于64)比较适合使用,能够解决阻塞模式下socket通信的accept()的阻塞问题,同时能够对通信设置超时检测

Slecet模型的主要参数
1、fd_set结构体

fd_set结构体被多种Windows Socket函数和服务提供者所使用,例如select函数,出于多种目的将sockets放入集合(set)中,例如通过selcet函数给出的readfds参数来测试socket是否可读

typedef struct fd_set {
  u_int  fd_count;
  SOCKET fd_array[FD_SETSIZE];
} fd_set, FD_SET, *PFD_SET, *LPFD_SET;

参数:
fd_count set中的socket数量
fd_array set中的socket序列

2、select()

确定的一个或多个Socket的状态,如果必要的话,会为同步I/O惊进行等待

int WSAAPI select(
  int           nfds,
  fd_set        *readfds,
  fd_set        *writefds,
  fd_set        *exceptfds,
  const timeval *timeout
);

参数:
nfds 忽略;只是为了兼容Berkeley sockets
readfds 指向一组socket数组,检查是否可读(有数据发来)
writefds 指向一组socket数组,检查是否可写(需要发送数据)
exceptfds 指向一组socket数组,检查是否有错误
timeout 最大等待时间

typedef struct timeval {
  long tv_sec;
  long tv_usec;
} TIMEVAL, *PTIMEVAL, *LPTIMEVAL;

tv_sec 秒数
tv_usec 毫秒数

3、使用流程

将所有的socket(服务器端+客户端)装进一个数组中
通过select()遍历socket数组
取出有相应的socket放进另一个数组(都是有响应的socket)
对装有响应的socket数组集中处理
服务器socket响应:客户端链接,调用accept()
客户端socket响应:客户端通信,调用send()或recv()

2、防火墙的规则定制和telnet测试端口通信

在进行行情客户端和服务器的连接显示时,会发现在本地客户端可以连接上,局域网内的其他主机无法连接
后发现是由于防火墙对端口进行了拦截
对于服务器而言,主要时入站的端口被拦截,导致客户端发送的连接请求进不来
可以在防火墙中进行添加入站规则来进行解决
以win10为例,
设置>>更新和安全>>windows安全中心>>防火墙和网络保护>>高级设置

在这里插入图片描述
后依次 入站规则>>新建规则 进入入站规则添加向导,按照自己的需求进行添加即可。

TIP:如果还是没法连接,还有一个最简单的方法——关闭防火墙!

3、SOUI窗口绘图的刷新

在进行K线界面的行情表和成交列表的刷新时,需要对自定义的两个控件进行重回。
由于两个控件都是继承于SWindow类,可以按照MFC中的Window类进行类比。
这里有两个选择:
1、UpdateWindow();
2、Invalidata();
一开始使用了UpdateWindow(),但是并没有进行控件的刷新;后改用Invalidata()函数,控件能够正常刷新。
这里于MFC好像存在着差异,在MFC中,UpdateWindow()函数会立即重绘窗口,而Invalidata()函数则是发送一个WM_PAINT消息,由于WM_PAINT的优先级较低,往往最后得到相应。

4、Sleep(0)的作用及与Sleep(1)的区别

在阻塞的socket模型中,经常会用到while(true)循环来接收信息,在没有信息发送过来时,程序依然在循环中进行空跑,会消耗大量的cpu。
在调用了Sleep()后,线程将会挂起,释放当前占用的cpu,后再按照优先级进行重新分配cpu。
调用Sleep(n)函数的意思通俗来讲,就是告诉系统在未来的n毫秒内,不在竞争cpu。
Sleep(0)则是瞬间挂起,然后再系统重新计算优先级时已经被唤醒,重新加入竞争,能够最大限度的减少cpu使用率的情况下保证自身线程的运行。
而由于系统并不是十分的精准,在Sleep(n)函数中,当n<10时,会以10来计算,在高频的运算中,会很大的减缓运算的速度。
参考文档:
fd-set API文档
Select API文档
网络编程——select模型(总结)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值