linux C语言用socket编程问题

BppleMan 2016-03-20 11:40:20
想写一个模拟telnet服务器的小东西,练习一下socket,用AF_INET模式进行连接,一切都正常,服务端程序运行起来后,在本机终端可以通过telnet 127.0.0.1 [端口号]进行连接服务端,目前是成功连接了,但是我在服务端增加了一个客户登录的功能,也就是说:telnet在进行连接成功后会收到服务器要求验证的消息,那么就要输入用户名和密码,但是输入密码的时候我又想使用类似stty -echo关闭回显的命令,但是我不知道怎样用服务端通知客户端在输入密码的时候关闭回显,不知道我描述清楚了没有,现在贴上login方法的代码

bool mySocket::LoginServer()
{
char enter[2];
char User[] = "请输入账号\n";
char Pass[] = "请输入密码\n";
char Success[] = "登录成功\n";
write(client_sockfd, User, sizeof(User));
read(client_sockfd, user, 4);
user[4] = '\0';
read(client_sockfd, &enter, 2);
write(client_sockfd, Pass, sizeof(Pass));
read(client_sockfd, password, 6);
password[6] = '\0';
read(client_sockfd, &enter, 2);
system("stty echo");
if (!strcmp(user, "root") && !strcmp(password, "123456"))
{
write(client_sockfd, Success, sizeof(Success));
return 1;
}
return 0;
}


简单来说,就是想要通过服务端通知客户端关闭echo回显
...全文
234 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
BppleMan 2016-03-26
  • 打赏
  • 举报
回复
引用 3 楼 yuelengdihai 的回复:
telnet ip >/dev/null
虽然没有解决问题,不过分给你吧
BppleMan 2016-03-21
  • 打赏
  • 举报
回复
引用 12 楼 yuelengdihai 的回复:
[quote=引用 7 楼 BppleMan 的回复:] [quote=引用 6 楼 yuelengdihai 的回复:] 就是先关闭回显 然后再显示?
差不多就是这个意思吧,输入密码的时候不显示具体输入了什么,输完回车以后打开回显,就好像ssh登陆某服务器要输入账户密码一样,同样不会看见密码[/quote] 这个肯定要在客户端那边操作了,把你那段代码写到客户端不就行了[/quote] 我强调很多遍,怕大家没看懂我题目的意思,客户端其实仅仅只是另一台linux电脑的telnet工具,仅仅只是/usr/bin里面的工具,不是我写的代码,我只写了服务端的代码,就是一个仿telnet服务器的一个小程序,要用客户端的telnet工具进行登陆服务端的仿telnet服务器,但是让客户端输入密码的时候不显示出来
赵4老师 2016-03-21
  • 打赏
  • 举报
回复
telnet 功能说明:远端登入。 语  法:telnet [-8acdEfFKLrx][-b<主机别名>][-e<脱离字符>][-k<域名>][-l<用户名称>][-n<记录文件>][-S<服务类型>][-X<认证形态>][主机名称或IP地址<通信端口>] 补充说明:执行telnet指令开启终端机阶段作业,并登入远端主机。 参  数: -8 允许使用8位字符资料,包括输入与输出。 -a 尝试自动登入远端系统。 -b<主机别名> 使用别名指定远端主机名称。 -c 不读取用户专属目录里的.telnetrc文件。 -d 启动排错模式。 -e<脱离字符> 设置脱离字符。 -E 滤除脱离字符。 -f 此参数的效果和指定"-F"参数相同。 -F 使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。 -k<域名> 使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。 -K 不自动登入远端主机。 -l<用户名称> 指定要登入远端主机的用户名称。 -L 允许输出8位字符资料。 -n<记录文件> 指定文件记录相关信息。 -r 使用类似rlogin指令的用户界面。 -S<服务类型> 设置telnet连线所需的IP TOS信息。 -x 假设主机有支持数据加密的功能,就使用它。 -X<认证形态> 关闭指定的认证形态。
cocoabird 2016-03-20
  • 打赏
  • 举报
回复
telnet ip >/dev/null
BppleMan 2016-03-20
  • 打赏
  • 举报
回复
引用 1 楼 yuelengdihai 的回复:
指令后面加上: >/dev/null ,这样log就不会保留了

额……这样不是很懂啊,你说的指令是指通过服务端发送,还是在客户端telnet的时候进行输入?是在telnet的命令模式下进行输入吗?我试了一下显示这样
cocoabird 2016-03-20
  • 打赏
  • 举报
回复
指令后面加上: >/dev/null ,这样log就不会保留了
cocoabird 2016-03-20
  • 打赏
  • 举报
回复
引用 7 楼 BppleMan 的回复:
[quote=引用 6 楼 yuelengdihai 的回复:] 就是先关闭回显 然后再显示?
差不多就是这个意思吧,输入密码的时候不显示具体输入了什么,输完回车以后打开回显,就好像ssh登陆某服务器要输入账户密码一样,同样不会看见密码[/quote] 这个肯定要在客户端那边操作了,把你那段代码写到客户端不就行了
stephen_csdn 2016-03-20
  • 打赏
  • 举报
回复
引用 10 楼 BppleMan 的回复:
[quote=引用 9 楼 butters10 的回复:] [quote=引用 8 楼 butters10 的回复:] 我去学习了一下,找到了一个方法,可行的:

#include <termios.h>
...
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO; //关键是这一步,与了一个显示的非
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt) //这一步回到旧格式

std::cin >> s;
...
擦,回到旧格式放后面~~[/quote] 这个能在telnet模式下起作用吗? 而且似乎这只是设置本地回显关闭,并不能进行远程控制?我的需求是,需要服务端发送那么一条指令给客户端(客户端是通过telnet访问客户端的),进而使客户端关闭回显[/quote] telnet的话,我又学习了一下telnet的协议,你可以看一下这个参考一下: http://www.faqs.org/rfcs/rfc857.html 感觉是发送IAC WON'T ECHO和IAC WILL ECHO
BppleMan 2016-03-20
  • 打赏
  • 举报
回复
引用 9 楼 butters10 的回复:
[quote=引用 8 楼 butters10 的回复:] 我去学习了一下,找到了一个方法,可行的:

#include <termios.h>
...
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO; //关键是这一步,与了一个显示的非
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt) //这一步回到旧格式

std::cin >> s;
...
擦,回到旧格式放后面~~[/quote] 这个能在telnet模式下起作用吗? 而且似乎这只是设置本地回显关闭,并不能进行远程控制?我的需求是,需要服务端发送那么一条指令给客户端(客户端是通过telnet访问客户端的),进而使客户端关闭回显
stephen_csdn 2016-03-20
  • 打赏
  • 举报
回复
引用 8 楼 butters10 的回复:
我去学习了一下,找到了一个方法,可行的:

#include <termios.h>
...
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO; //关键是这一步,与了一个显示的非
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt) //这一步回到旧格式

std::cin >> s;
...
擦,回到旧格式放后面~~
stephen_csdn 2016-03-20
  • 打赏
  • 举报
回复
我去学习了一下,找到了一个方法,可行的:

#include <termios.h>
...
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO; //关键是这一步,与了一个显示的非
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt) //这一步回到旧格式

std::cin >> s;
...
BppleMan 2016-03-20
  • 打赏
  • 举报
回复
引用 6 楼 yuelengdihai 的回复:
就是先关闭回显 然后再显示?
差不多就是这个意思吧,输入密码的时候不显示具体输入了什么,输完回车以后打开回显,就好像ssh登陆某服务器要输入账户密码一样,同样不会看见密码
cocoabird 2016-03-20
  • 打赏
  • 举报
回复
就是先关闭回显 然后再显示?
BppleMan 2016-03-20
  • 打赏
  • 举报
回复
对问题补充一下,我写了个socket的服务端,在客户端上面用telnet进行连接,但是需要一个登陆也就是输入密码的过程,那么我想在telnet实现以下效果


上图并没有使用socket,代码如下
char a[100];
printf("请输入密码:");
system("stty -echo");
scanf("%s",a);
system("stty echo");
printf("\n刚才输入的是:%s\n",a);

这只是本地写的一个小程序,但我想在telnet里面实现这样的输入
BppleMan 2016-03-20
  • 打赏
  • 举报
回复
引用 3 楼 yuelengdihai 的回复:
telnet ip >/dev/null

非常感谢你的回答,但这并不是我要的答案,我是想要下面的效果


但是这只是在本地简单调用了stty -echo的命令

char a[100];
printf("请输入密码:");
system("stty -echo");
scanf("%s",a);
system("stty echo");
printf("\n刚才输入的是:%s\n",a);

我是想要通过socket服务端发送一个命令,让客户端在使用telnet输入密码的时候,得到上图的效果

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧