我写了下面的程序(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;
}
就是在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;
}
而你只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;
}