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

posted on 2013-01-20 11:15  mk工作室  阅读(168)  评论(0编辑  收藏  举报

导航