user-0 提问: socket发送命令到telnet客户端问题

回复:
user: user-0
content: [quote=引用 2 楼 zhao4zhong1 的回复:]   已经解决，谢谢赵4老师和liubo_1993的帮助，感觉多少分都无法表达您们对我的帮助，谢谢您们！ 下面是我所进行的一点修改，希望以后别人搜到这个帖子时能够感受到我们共同的努力。 [code=c]DWORD CSocketTx::SendTh(CSocketTx *pSocketTx) {     char pBuff[256]="username\r\npassword\r\n";//这个地方看不同的东西，进入的方式不同做出修改     int nRet,i;     char ch;      i=0;     while(1) {//这里要判断一下，要不然会无限循环，写成while（‘\t’）,也可以写别的。。。         if ( pSocketTx->m_nExit == 1 ) {             ExitThread(0);             return 0;         }         //等待用户输入信息 //      WaitForSingleObject(stdin1,INFINITE); //      ch=getch();         ch=pBuff[i++];                  //将用户的输入信息发送给Telnet服务器         nRet = send(pSocketTx->m_hSocket,&ch,sizeof(ch),0);         if ( nRet == SOCKET_ERROR ) {             TRACE("\nSend Fail........!\n");             pSocketTx->m_nExit = 0;             continue;         }       //这里要记得加一下i的判断，个人感觉没什么用多少不过我加了for（i=50）{i=0；continue；}要将i置零。     }     return 0; }

user: user-1
content: 引用 8 楼 markxiaokeng 的回复:[quote=引用 6 楼 liubo_1993 的回复:] 在你接受数据的线程，recv收到的串和login:，Password:比较，如果是login:就立马send一个用户名的串，如果是Password就send一个密码的串，如果是其他不做任何操作 您好，那意思就是我要定义一个数组为login[]="login";,password[]="password";,然后把这个放到recv这里是吗， nRet = recv(pSocketTx->m_hSocket,pBuf,sizeof(pBuf),0);这里来判断当我输完ip是ok的，返回login等待输入，然后就在sand函数模块下发送一个str1="root";str2="****";这样可行吗？但是我感觉这样做的话，while（1），循环我就不知道怎么弄了。[/quote]  用pBuf和你的两个string比较，如果和login相同就send一个用户名的串，如果和password相同就send一个密码的串，这些内容是写在你接受的线程中，不是在这个线程

user: user-2
content: DWORD CSocketTx::SendTh(CSocketTx *pSocketTx) {     char pBuff[256]="username\r\npassword\r\n";     int nRet,i;     char ch;      i=0;     while(1) {         if ( pSocketTx->m_nExit == 1 ) {             ExitThread(0);             return 0;         }         //等待用户输入信息 //      WaitForSingleObject(stdin1,INFINITE); //      ch=getch();         ch=pBuff[i++];         if (!ch) break;         //将用户的输入信息发送给Telnet服务器         nRet = send(pSocketTx->m_hSocket,&ch,sizeof(ch),0);         if ( nRet == SOCKET_ERROR ) {             TRACE("\nSend Fail........!\n");             pSocketTx->m_nExit = 0;             continue;         }     }     return 0; }

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:DWORD CSocketTx::SendTh(CSocketTx *pSocketTx) {     char pBuff[256]="username\r\npassword\r\n";     int nRet,i;     char ch;      i=0;     while(1) {         if ( pSocketTx->m_nExit == 1 ) {             ExitThread(0);             return 0;         }         //等待用户输入信息 //      WaitForSingleObject(stdin1,INFINITE); //      ch=getch();         ch=pBuff[i++];                  //将用户的输入信息发送给Telnet服务器         nRet = send(pSocketTx->m_hSocket,&ch,sizeof(ch),0);         if ( nRet == SOCKET_ERROR ) {             TRACE("\nSend Fail........!\n");             pSocketTx->m_nExit = 0;             continue;         }     }     return 0; }  赵老师您好，您的code是可以运行的，只要把//if (!ch) break;这一行去掉，是可以进到路由的，但是他会出现这样的情况 那个乱码我想把这个数组先清零char pBuff[256]={‘\0’};然后再赋值，但那个错误提示是怎么回事，难道是信息缓存区出现了问题，还有这个while（）是怎么处理的，以为会做一些无用的循环。。。。

user: user-0
content: 求大神现身。

user: user-0
content: 引用 6 楼 liubo_1993 的回复:在你接受数据的线程，recv收到的串和login:，Password:比较，如果是login:就立马send一个用户名的串，如果是Password就send一个密码的串，如果是其他不做任何操作 您好，那意思就是我要定义一个数组为login[]="login";,password[]="password";,然后把这个放到recv这里是吗， nRet = recv(pSocketTx->m_hSocket,pBuf,sizeof(pBuf),0);这里来判断当我输完ip是ok的，返回login等待输入，然后就在sand函数模块下发送一个str1="root";str2="****";这样可行吗？但是我感觉这样做的话，while（1），循环我就不知道怎么弄了。

user: user-1
content: 引用 5 楼 markxiaokeng 的回复:[quote=引用 3 楼 liubo_1993 的回复:] ch定义成char *的不就可以了，从键盘接的时候用gets(ch); send(pSocketTx->m_hSocket,ch,sizeof(ch),0); 您好，您那个方法我也用过，不可以我不知道为什么我们可以输入进行输入用户名：root，但是我按回车时它不会提示我们输入密码，也就是程序到登录提示就停止了，是不是加个判断，当我输入字符串了，按enter键就发送指令。。。[/quote]  不需要判断的，不过读入字符串一定要用gets()

user: user-1
content: 在你接受数据的线程，recv收到的串和login:，Password:比较，如果是login:就立马send一个用户名的串，如果是Password就send一个密码的串，如果是其他不做任何操作

user: user-0
content: 引用 3 楼 liubo_1993 的回复:ch定义成char *的不就可以了，从键盘接的时候用gets(ch); send(pSocketTx->m_hSocket,ch,sizeof(ch),0); 您好，您那个方法我也用过，不可以我不知道为什么我们可以输入进行输入用户名：root，但是我按回车时它不会提示我们输入密码，也就是程序到登录提示就停止了，是不是加个判断，当我输入字符串了，按enter键就发送指令。。。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:DWORD CSocketTx::SendTh(CSocketTx *pSocketTx) {     char pBuff[256]="username\r\npassword\r\n";     int nRet,i;     char ch;      i=0;     while(1) {         if ( pSocketTx->m_nExit == 1 ) {             ExitThread(0);             return 0;         }         //等待用户输入信息 //      WaitForSingleObject(stdin1,INFINITE); //      ch=getch();         ch=pBuff[i++];         if (!ch) break;         //将用户的输入信息发送给Telnet服务器         nRet = send(pSocketTx->m_hSocket,&ch,sizeof(ch),0);         if ( nRet == SOCKET_ERROR ) {             TRACE("\nSend Fail........!\n");             pSocketTx->m_nExit = 0;             continue;         }     }     return 0; }  赵4老师您好！我用了你改的程序，无法进入到路由器，运行的时候是第一幅图，是不是我把username改成root，password改成我的密码造成的。第二幅图是我原本的程序运行出来的，需要手动输入用户名和密码，现在我想不用我输入那个root和密码，直接进入到提示界面。这个怎么办？

user: user-1
content: ch定义成char *的不就可以了，从键盘接的时候用gets(ch); send(pSocketTx->m_hSocket,ch,sizeof(ch),0);