我写了下面的程序(VC6, win2k)
就是在server建立两个管道,和进程CMD.exe相连,
server接收到client的数据通过管道写入CMD,
把CMD输出的数据通过管道发送回给client,
但处理backspace键时总是有问题,
下面的程序,只能对第一个backspace起作用。
例如:
在client端:dir[backspace][backspace]
按两下backspace,CMD得到的只是di,而不d,
为什么?
void func
{
.....
  CreatePipe(&hReadPipe, &hWriteFile, &pipeattr, 0);

  char back[3]; //定义backspace
  back[0] = 0x08;
  back[1] = 0x20;
  back[2] = 0x08;
 
  while(true)
 {
  ......
   nByteToWrite = recv(ClientSocket, recv_buff, 1024, 0);
  ......
  
  t = recv_buff[0];
  if ( t==8 ) //用户按了backspace键
  {
    send(ClientSocket, back, strlen(back), 0);
    Sleep(100);
    DWORD temp;
    WriteFile(hWriteFile, back, strlen(back), &temp, NULL);
 }
 else
 {
   send( ClientSocket, recv_buff, nByteToWrite, 0 );
  Sleep(100);
  WriteFile(hWriteFile, recv_buff, nByteToWrite, &nByteWritten, NULL);
 }
}
return 0;
}

解决方案 »

  1.   

    你这应该是没有对齐,因为你判断的是BUF[0],但backspace在其他位置的时候你就漏掉了.
    而你只RECV了一下,这样根本不能保证每次收到的数据包就是你想要的字节数.它可能收到的字节数量不是随机的.要么自己写个RECV函数.如下.要么一次只接收一个字节
    //接收数据
    BOOL RecvData(SOCKET s, char *data, int len)
    {
    char * p = data;
    int i = 0;
    int k = len;
    int ret = 0; if(len <= 0)
    {
    return TRUE;
    } while(1)
    {
    ret = recv(s,p,k,0);
    if(ret == 0 || ret == SOCKET_ERROR)
    {
    TRACE("RecvData %d,%d\n",ret,WSAGetLastError());
    return FALSE;
    }
    i += ret;
    p += ret;
    k -= ret;
    if(i >= len)
    {
    break;
    }
    }
    return TRUE;
    }