博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
winsock学习1
阅读量:6359 次
发布时间:2019-06-23

本文共 1295 字,大约阅读时间需要 4 分钟。

winsock顾名思义就是电脑间交换数据用的,首先要new一个socket

然后加载DLL,关闭用closeSocket

通信分TCP和UDP两种类型

TCP用send /recv两个函数。可靠连接 保证连接上了才传数据

UDP用sendto/recvfrom两个函数 不可靠连接 数据直接传 不保证连接 数据可能收不到

TCP那种 需要经过listen- bind- accept的connect过程之后才能recv

对于阻塞上分 阻塞和不阻塞

如果单线程的话阻塞的 那样程序会卡在那里 不阻塞会立刻返回没有问题

 

为了解决这个问题MS提供了5种select函数 处理多socket连接阻塞问题 提高效率

1.select模型

intselect(

intnfds,
fd_set FAR*readfds,
fd_set FAR*writefds,
fd_set FAR*exceptfds,
conststructtimevalFAR*timeout
);
第一个参数不要管,会被系统忽略的。第二个参数是用来检查套接字可读性,也就说检查套接字上是否有数据可读,同样,第三个参数用来检查数据是否可以发出。最后一个是检查是否有带外数据可读取。
参数详细的意思请去看MSDN,这里限于篇幅不详细解释了。
最后一个参数是用来设置select等待多久的,是个结构:
structtimeval{
longtv_sec;//seconds
longtv_usec;//andmicroseconds
};

其实fd_set是一个集合存放socket的 select就是一个处理socket集合的函数 需要处理的 加入socket中。然后每次判断一下是还在然后再accept

如                  

                while(1){ 

                     FD_ZERO(&fdread);//初始化fd_set

        FD_SET(fdServer,&fdread);//分配套接字句柄到相应的fd_set

        
        
        tv.tv_sec=2;//这里我们打算让select等待两秒后返回,避免被锁死,也避免马上返回
        tv.tv_usec=0;
        
        select(0,&fdread,NULL,NULL,&tv);
        
        nSize=sizeof(server);
        if(FD_ISSET(fdServer,&fdread)){

accept().....

break;

}

}

recv.....

实际上管理了连接 如果没有连接的话去做其它事

后面还有异步选择(WSAAsyncSelect)、事件选择(WSAEventSelect)、重叠I/O(Overlapped I/O)和完成端口(Completion Port)共五种I/O模型

 PS:个人学习笔记 不喜勿喷 - -。

转载于:https://www.cnblogs.com/mkorion/archive/2013/01/20/2868363.html

你可能感兴趣的文章
Windows 10 份额突破 40%,Windows 7 连跌四月终回升
查看>>
怎么把Maven项目转为动态Web项目?
查看>>
Arm发布Cortex-A76AE自动驾驶芯片架构,宣示车载系统市场主权
查看>>
Hibernate入门教程
查看>>
Java支付宝扫码支付[新]
查看>>
SpringMVC 拦截器 筛选
查看>>
第十八章:MVVM(八)
查看>>
点击表头切换升降序排序方式
查看>>
第26天,Django之include本质
查看>>
Java中静态变量和实例变量的区别
查看>>
秋名山老司机(详解)——bugku
查看>>
RED | Robot Framework集成开发环境
查看>>
育碧同 Mozilla 联手开发 AI 代码助手
查看>>
【实用】面对枯燥的源码,如何才能看得下去?
查看>>
智库说 | 徐远:数字时代的城市潜力
查看>>
《JSP极简教程》jsp c:forEach用法
查看>>
WebSocket详解(六):刨根问底WebSocket与Socket的关系
查看>>
用 Go 写一个轻量级的 ssh 批量操作工具
查看>>
网站设计之合理架构CSS 架构CSS
查看>>
D语言/DLang 2.085.1 发布,修复性迭代
查看>>