winsock学习1
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:个人学习笔记 不喜勿喷 - -。