我给服务器发信息 然后服务器就给我回一个信息 我就接受程序可以连接成功 发送函数 send也返回了正确的字符长度
但继续执行recv函数时 程序老半天没反应了 
 代码如下 请大家帮看看是什么问题
SOCKET m_hSock;
m_hSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_hSock!=INVALID_SOCKET)
{
   BOOL sopt = TRUE;
   setsockopt(m_hSock, IPPROTO_TCP, TCP_NODELAY, 
   (char *)&sopt, sizeof(BOOL));

   SOCKADDR_IN sockaddr;
   memset(&sockaddr, 0, sizeof(SOCKADDR_IN));
    ....
    ....
   if(bConnect==SOCKET_ERROR) 
   {
MessageBox(NULL,"连接失败","警告",NULL); 
   }
   else 
   {   
     char send_buf[]={"ereyev"}; //字符串正确 
     int bytesSend=send(m_hSock,send_buf,strlen(send_buf),0); //已经发送成功了     //问题在这下面
     int bytesRecv = SOCKET_ERROR;
     char recv_buf[1024]="";
     memset(&recv_buf,0,sizeof(recv_buf));
     
     while( bytesRecv == SOCKET_ERROR ) 
     {
bytesRecv = recv( m_hSock, recv_buf, strlen(recv_buf), 0 );
           if ( bytesRecv == 0 || WSAGetLastError() == WSAECONNRESET ) 
{
   AfxMessageBox( "Connection Closed.\n");
   break;
}
else
{
   AfxMessageBox(bytesRecv);
}
     }
    }

解决方案 »

  1.   

    改成:bytesRecv = recv( m_hSock, recv_buf, strlen(recv_buf)+1, 0 );
      

  2.   

    你的recv中的strlen(recv_buf),在第一次接受时为 0  !!!
      

  3.   

    但继续执行recv函数时 程序老半天没反应了 
    因为客户端在等待服务器端发送数据过来,所以端口一直在监听有没有数据发送过来,处于阻塞状态~~
    对了,你的服务器端发送部分的代码贴出来看看,有可能是服务器端发送数据出错,使得客户端一直在等待数据~~~
      

  4.   

    而且对你这个接收用的循环也存在怀疑,会经常堵在recv这里吧。
      

  5.   

    谢谢各位了
    是啊  我的程序就是堵在recv这里 没反应了
    用Getlasterror()都不能获取错误号
      

  6.   

    bytesRecv = recv( m_hSock, recv_buf, strlen(recv_buf), 0 );
    程序执行始终阻塞到以上这行,不往下走.我这边的代码好象没有什么问题啊?
    各位有意见就提一下啊
      

  7.   

    strlen(recv_buf) ==》 strlen(recv_buf)+1缓存的空间是不是少了?
      

  8.   

    bytesRecv = recv( m_hSock, recv_buf, strlen(recv_buf), 0 );
    recv要从套接口m_hSock中读取strlen(recv_buf)长的数据到recv_buf中,你定义的recv_buf是1024,最好检查一下服务器发回的字节数够不够1024,如果不够,没意外中断情况下recv要阻塞到读完1024为止才返回。
      

  9.   

    你的问题可能是服务器端没有发送数据到客户端,所以,客户端一直在recv,处于阻塞状态.~~~
      

  10.   

    谢谢各位啊 
    我又重新想了一边 可不可能是我发的指令里有错 导致服务器没回执指令
    结果我用抓包软件一看的确和要求发的指令 有点不同就是
    发的内容都一样的 但是服务器接受的指令里还有个结束符 但这个结束我不知道怎么发过去啊
    要求发的指令:
    content             包信息         
    :000450000008A4     3A 30 30 30 34 35 30 30 30 30 30 30 38 41 34 0D 0A 
    (这个0D 0A是祯结束符)
    但我是这样发的char send_buf[]={":000450000008A4\0"};
    发的信息截下来是这样的:
    content             包信息         
    :000450000008A4     3A 30 30 30 34 35 30 30 30 30 30 30 38 41 34 00 00  请问我怎么才能把这个贞结束符给发出去 和他要求的指令一样呢?
    谢谢各位给的建议 非常谢谢啊  分不够可以再加
      

  11.   

    你的send_buf[]={":000450000008A4\0"};中的最后一个\0是必须要的吗?
    如果不是必须要的,你可以:strcat( send_buf, "\r\n" );如果是必须要的,你可以:
    char *send_buf;
    int i = strlen(":000450000008A4");
    send_buf = (char*)malloc( i+3 );
    ZeroMemory( send_buf, i+3 );
    strcpy( send_buf, ":000450000008A4" );
    send_buf[i+1] = '\r';
    send_buf[i+2] = '\n';
    ...
    ...
    int bytesSend=send(m_hSock,send_buf,i+3,0); 
    ...
    ...
    //最后别忘了释放
    free( send_buf );