我想在一个SOCKET中进行数据的收和发。当有人发送数据来时,就显示出来;当我输入数据时则把数据发送出去。怎么判断SOCKET中是否有数据到来,从而显示出来呢???要非阻塞的。。谢谢!!!!

解决方案 »

  1.   

    用WSAEventSelect或WSAAsyncSelect注册网络事件或消息,FD_READ,当数据到来时,就会自动触发事件或窗口消息
      

  2.   

    用while循环不断的检查是否有数据到来,或者选用一个I/O模型,楼上介绍的都可以。
      

  3.   

    共有五种类型的套接字I / O模型,可让Wi n s o c k应用程序对I / O进行管理,它们包括: s e l e c t
    (选择)、W S A A s y n c S e l e c t(异步选择)、W S A E v e n t S e l e c t(事件选择)、o v e r l a p p e d(重叠)
    以及completion port(完成端口)。
      

  4.   

    首先先将socket设为非阻塞
    u_long val=1;
    ioctlsocket(sock,FIONBIO,&val);
    fd_set read;
    fd_set write;
    FD_CLR(&read)
    FD_CLR(&write);
    FD_SET(sock,&read);
    FD_SET(sock,&write);
    while(true)
    {
       int r=select(0,read,write,NULL,NULL);
       if(r>0)}
      

  5.   

    接着写,不小心动了回车:if(r>0)
    {
    if(FD_ISSET(sock,&read))
    {
    可读了
    }
    if(FD_ISSET(sock,&write))
    {
    可写了
    }
    }
      

  6.   

    不要忘了,将使用后的sock,要重新放入read或write中
      

  7.   

    先谢各位了!这里我还点不太明白。read读是可以理解,当socket有数据时可以通过FD_ISSET(sock,&read))来判断,然后调用rev()。但是write写我就不太明白了,用FD_ISSET(sock,&write)来判断能不能写???写是用户想发数据是才写吧,这不是由用户来决定的吗。FD_ISSET(sock,&write)怎么判断的呢??FD_ISSET(sock,&write)是不是说用来判断socket中是否有数据,当没有数据时返回TRUE呢??
      

  8.   

    FD_ISSET(sock,&write) 判断 socket是否具有发送功能当 socket关闭或是缓冲区满的时候,会返回 FALSE,表明如果调用send发送数据,将会返回错误