本帖最后由 VisualEleven 于 2010-10-28 10:36:40 编辑

解决方案 »

  1.   

    因为client上有数据可读,但是你一直没有读
      

  2.   


    void CTcpClientDlg::OnConnect() //button
    {
    sock=socket(AF_INET,SOCK_STREAM,0);
    if (sock==INVALID_SOCKET)
    {
    AfxMessageBox("socket创建失败");
    return ;
    }
    sockaddr_in saddr;
    saddr.sin_family=AF_INET;
    saddr.sin_addr.s_addr=inet_addr(m_toIp);
    saddr.sin_port=htons(m_toPort); if (0!=connect(sock,(sockaddr*)&saddr,sizeof(saddr)))
    {
    AfxMessageBox("connect失败");
    return ;
    }

    char buf[]="hello";
    send(sock,buf,strlen(buf),0);
    closesocket(sock);
    }
    这是发送代码
      

  3.   

    首先要设置其阻塞模式,调用ioctlsocket()这个函数,你MSDN或者google一下看看
      

  4.   


    你这个OnConnect在循环的回调吧
      

  5.   

    楼主不理解select模型啊...http://www.cnblogs.com/Jimmly/archive/2009/07/23/1529529.html
      

  6.   

    改成select(client+1,&readfds,NULL,NULL,&time);
      

  7.   


    recv(client,buf,sizeof(buf),0);
    这个地方需要判断返回值,等于-1出错,等于0正常关闭,大于0,表示收到的数据大小
    windows下第一个参数忽略,unix下面,该参数必须为SET进去的socket最大值+1
      

  8.   


    windows下也不能完全忽略,也可能存在需要加1的情况
      

  9.   

    不解,如果SELECT返回的不是1那应该是多少,你只是把一个通信SOCKET加入到读集中去,如果有与其相应的消息发送来,当然应该返回1了~~~
      

  10.   

    不解,难道与int 和 SOCKET有关?
      

  11.   

    你的while循环中的select写的有些问题。
    while(TRUE)
    {
     fd_set fdRead = fdSocket;
     int nRet = select(0, &fdRead, NULL, NULL, NULL);
     if(nRet > 0)
     {
       for(int i=0; i<(int)fdSocket.fd_count; i++)
       {
         if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
         {
            if(sListen == fdSocket.fd_array[i])
            {
              if(fdSocket.fd_count < FD_SETSIZE)
              {
                SOCKADDR_IN addr;
                memset(&addr, 0, sizeof(addr));
                int len = sizeof(addr);
                SOCKET sNew = accept(sListen, (LPSOCKADDR)&addr, &len);
                if(INVALID_SOCKET == sNew)
                {
                    // Error
                    continue;
                }
                FD_SET(sNew, &fdSocket);
              }
              else
              {
                printf("Too much connections.\n");
                continue;
              }
             }
             else
             {
                char szbuf[256] = {0};
                int nRecv = recv(fdSocket.fd_array[i], szbuf, 256, 0);
                if(nRecv > 0)
                {
                  printf("recv data: %s", szbuf);
                }
                else
                {
                  closesocket(fdSocket.fd_array[i]);
                  FD_CLR(fdSocket.fd_array[i], &fdSocket);              
                }
             }
         }
       }
     }
     else
     {
       printf("select failed with error code: %d", WSAGetLastError());
       break;
     }
    }