本帖最后由 oyljerry 于 2013-10-13 11:53:30 编辑

解决方案 »

  1.   

    不算异步  只是不停的循环检测是否有数据可读或者可写 但一般来说select模式是在新线程里面判断 不会卡死主线程...
      

  2.   

    那异步通信实现只是用wsaasync初始化呗?
    用WSAStartup()初始化soocket send recv发送信息堵塞一段时间 accept链接堵塞一段时间 ?
    用WSAAsync初使化 send recv发生信息非堵塞 accept链接非堵塞 ?
      

  3.   

    几个概念 弄混了吧1)send recv收发信息是否阻塞,这是 阻塞/非阻塞 模式;
    2)如何得到网络事件通知,要么用 轮询模式,要么用事件驱动模式。
    3)同步通讯/异步通讯,这是网络通讯协议中的物理层和数据链路层关心的事情。
      

  4.   


    你说的socket异步通讯问题,应该是指WSAAsyncSelect()调用,也属于网络事件获取的模型中的事件驱动范畴。网络事件获取 无外乎轮询模式和事件驱动模式。
    轮询模式要使用select()调用:
    while (1) {
      if (select()) { ... }
      Sleep(50);
    }事件驱动模式:可以使用Windows消息通知
      调用 WSAAsyncSelect(socket, hWnd, WM_USER_SOCK, ...),如果有多个socket,可定义多个消息ID
      然后在消息循环中响应WM_USER_SOCK消息进行处理。事件驱动模式:或者使用WSAEVENT事件通知
      调用 WSAEventSelect()
      然后WSAWaitForMultipleEvents() 等待WSAEVENT事件;参考 http://blog.csdn.net/hellomike/article/details/5524207
      WSAAsyncSelect 和WSAEventSelect的用法
      

  5.   

    http://blog.csdn.net/hmsiwtv/article/details/7952266
    //大哥这个帖子里说的异步是指的是?   if((AcceptSocket = accept(ListenSocket, NULL, NULL))   !=   INVALID_SOCKET)   
    154                     {   
    155                         // 设置套接字AcceptSocket为非阻塞模式
    156 // 这样服务器在调用WSASend()函数发送数据时就不会被阻塞
    157                         NonBlock   =   1;   
    158                         if(ioctlsocket(AcceptSocket, FIONBIO, &NonBlock)   ==   SOCKET_ERROR)   
    159                         {   
    160                             printf("ioctlsocket()   failed   with   error   %d\n",   WSAGetLastError());   
    161                             return -1;                             
    162                         }   你说的socket异步通讯问题,应该是指WSAAsyncSelect()调用,也属于网络事件获取的模型中的事件驱动范畴。网络事件获取 无外乎轮询模式和事件驱动模式。
    轮询模式要使用select()调用:
    while (1) {
      if (select()) { ... }
      Sleep(50);
    }事件驱动模式:可以使用Windows消息通知
      调用 WSAAsyncSelect(socket, hWnd, WM_USER_SOCK, ...),如果有多个socket,可定义多个消息ID
      然后在消息循环中响应WM_USER_SOCK消息进行处理。事件驱动模式:或者使用WSAEVENT事件通知
      调用 WSAEventSelect()
      然后WSAWaitForMultipleEvents() 等待WSAEVENT事件;参考 http://blog.csdn.net/hellomike/article/details/5524207
      WSAAsyncSelect 和WSAEventSelect的用法
      

  6.   

    在这个帖子里根本没有看到“异步”处理的代码。server端用的是 while(TRUE){ if select() ... },实际上是轮询模式。
    client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。
      

  7.   

    在下愚钝,ioctlsocket只是链接服务器变成非堵塞链接呗。//我记的connect链接一段时间 就返回timeout 那就是ioctlsocket就是不等待一段时间,连不上就返回呗?那你说的异步通信是使用事件驱动模式吗?  轮询模式也不算异步呗?我理解的异步是 服务器不必等待客户端发送信息,同步就是 服务器等待客户端发送信息。
    非堵塞是发送消息 不等待发送成功就返回,堵塞是发送消息,等待发送成功就返回。
    在这个帖子里根本没有看到“异步”处理的代码。server端用的是 while(TRUE){ if select() ... },实际上是轮询模式。
    client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。
      

  8.   

    最近学了一个select封装的模型,觉得select封装的还是不错的
    windows下使用WSAASYNC*封装起来比较简单点,随便学下IO完成端口模型
      

  9.   

    在这个帖子里根本没有看到“异步”处理的代码。server端用的是 while(TRUE){ if select() ... },实际上是轮询模式。
    client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。

    没事,一起讨论吧。是的。ioctlsocket(..., FIONBIO,...)用于设置socket处理blocking或者nonblocking模式,这会影响connect accept send recv的运行特性。
    nonblocking模式下,connect会立即返回SOCKET_ERROR错误且WSAGetLastError 返回WSAEWOULDBLOCK,详见msdn.我看MSDN里强调的主要是blocking/nonblocking,没有看到关于socket中的同步异步的明确说法。我理解所谓socket通讯的异步模式,应该是指使用了WSAAsyncSelect()。Async前缀的意思是异步。那这个"异步"WSAAsyncSelect应该是相对于传统的所谓"同步"select()而言的。调用了WSAAsyncSelect,就意味着程序应该采用事件驱动模式获取socket事件通知,而不需要去select轮询.
      

  10.   

    哦 wsaasyncselect+事件驱动是异步通信,
    那用wsastarup + 事件驱动算什么通信方式?
    那用wsastarup + select 相当于异步通信?还有异步/同步是说服务器与客户端之间是否同步?那堵塞/非堵塞是说发送/接收函数是发送消息 等待/不等待 成功与否。在这个帖子里根本没有看到“异步”处理的代码。server端用的是 while(TRUE){ if select() ... },实际上是轮询模式。
    client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。

    没事,一起讨论吧。是的。ioctlsocket(..., FIONBIO,...)用于设置socket处理blocking或者nonblocking模式,这会影响connect accept send recv的运行特性。
    nonblocking模式下,connect会立即返回SOCKET_ERROR错误且WSAGetLastError 返回WSAEWOULDBLOCK,详见msdn.我看MSDN里强调的主要是blocking/nonblocking,没有看到关于socket中的同步异步的明确说法。我理解所谓socket通讯的异步模式,应该是指使用了WSAAsyncSelect()。Async前缀的意思是异步。那这个"异步"WSAAsyncSelect应该是相对于传统的所谓"同步"select()而言的。调用了WSAAsyncSelect,就意味着程序应该采用事件驱动模式获取socket事件通知,而不需要去select轮询.
      

  11.   

    我只是从字面上推测:WSAAsyncSelect算异步通信。
    我确实不清楚什么是SOCKET同步模式,我一般用轮询/非轮询来划分SOCKET程序的工作模式。WSAStartup是Windows Sockets应用必须调用的,与轮询/非轮询、同步异步、阻塞不阻塞无关。“异步/同步”绝对不是说服务器与客户端之间是否同步。
    是的,“堵塞/非堵塞”是指是否等待操作完成。非阻塞时,API立即返回,不等待操作完成。之后SOCKET协议栈会产生一个select事件通知我们这个API的执行结果。