定义了一套协议
其中每个类型的帧有命令类型,有协议的总长度,但是不知道怎么处理,因为协议长度不一样,每次的收如何处理

解决方案 »

  1.   

    INT
    WINAPI RCARecv_EventSelectIO( 
    SOCKET s, 
    HANDLE hEventArray[2],
    char* buf,
    const int len
    )
    {
    if( (buf == NULL) || (len==0) )
    return FALSE;

    int ret;
    DWORD dwret;
    int count = len;
    int index = 0;
    WSANETWORKEVENTS ns; while( count > 0 )
    {
    ret = recv( s, &(buf[index]), count, 0 ); if( ret == SOCKET_ERROR )
    {
    // 如果发送错误,并且错误代码不是"被阻塞", 则返回 FALSE ( 发生了网络错误 )
    if( WSAGetLastError() != WSAEWOULDBLOCK )
    return len - count; } else if( ret == 0 )
    {
    return len - count ; } else 
    {
    // 如果成功发送, 则更新缓冲偏移字节数和待发总字节数
    index += ret;
    count -= ret;
    continue;
    }怎么修改这段代码成为可处理变长的呢
      

  2.   

    应该不会吧tcp和io都是变长的协议
      

  3.   

    TCP的消息不是定长的,但消息头是定长的,接收时只需先接收到消息头(固定长度),就可以从中知道后面的有效载荷有多少。
      

  4.   

    每个包不是有总长度吗,按长度收取不就完事了?int ReceivePacket(char *buf, int buflen)
    {
      int len = 0, count, ret;
      ret = recv(sock, &len, sizeof(int), 0);
      
      (*int)buf = len;
      
      count = ntohl(len);
      buf += sizeof(int);
      len = count - sizeof(int);
      buflen = buflen - sizeof(int);  while (len > 0)
      {
         ret = recv(sock, (void*)buf, len, 0);
         if (ret != SOCKET_ERROR)
         {
             buf += ret;
             len -= ret;
          }
      }
      return (len <= 0) ? count : -1;
    }大概这样,不太熟C
      

  5.   

    看看modbus协议,可以多了解一些