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

本文共 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

你可能感兴趣的文章
ArcGIS遍历区域内要素的属性(python)
查看>>
Linux 性能监测:Memory
查看>>
优化屏障和内存屏障
查看>>
Maven代理设置
查看>>
"Mac OS X"想要进行更改。键入管理员的名称和密码以允许执行此操作("Mac OS X"想使用系统钥匙串)...
查看>>
hdu2021 11页水题
查看>>
iOSApp版本更新
查看>>
ios自动布局实现动画
查看>>
.NET签名和重载
查看>>
Xamarin引用第三方包错误解决方法
查看>>
Html2Text
查看>>
简单的设计不简单
查看>>
prm文件总结
查看>>
C#+gdi 绘制汉字 鼠标点击笔画 实现动态类似flash填充该怎么做?多谢大家...
查看>>
SQL行转列
查看>>
android真机调试方法
查看>>
SQL Server 2008中原生的分层数据类型:hierarchyid(转)
查看>>
C++ 重载、覆盖和隐藏
查看>>
Silverlight浮动窗体 floatablewindow 非模态对话框
查看>>
C#解析json文件的方法
查看>>