【发布时间】:2015-06-11 01:08:34
【问题描述】:
我在使用 telnet 和 echo 在一行中通过 TCP 套接字读取客户端输入时遇到问题。它仅在我在“正常”远程登录会话中输入消息时才有效:
客户端控制台
devbox cehrig # telnet 127.0.0.1 50231
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Test Message
Connection closed by foreign host.
devbox cehrig # echo "One Liner" | telnet 127.0.0.1 50231
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
devbox cehrig #
服务器控制台
Mon Apr 6 16:36:41 2015: Accepting connections...
Mon Apr 6 16:36:45 2015: Inbound connection from 127.0.0.1
Client msg: Test Message
Mon Apr 6 16:36:48 2015: Accepting connections...
Mon Apr 6 16:44:06 2015: Inbound connection from 127.0.0.1
Client msg:
Mon Apr 6 16:44:06 2015: Accepting connections...
尝试使用 echo "" | 发送数据时,"Client msg" 一直为空远程登录 ....
这是我用来从客户端套接字读取的函数:
void read_socket(int idntef,
config_t * cfg)
{
int n;
char * _buf = (char *) malloc(512*sizeof(char));
char * _cor = (char *) malloc(512*sizeof(char));
char * _out = _cor;
bzero(_buf, 512);
bzero(_cor, 512);
if((n = read(idntef, _buf, 511)) < 0) {
_print(stderr, "messages.socketreadfail", cfg, 1);
_exit(0);
}
int x = 0;
while(*_buf != '\n' && x++ <= 512) {
*_cor++ = *_buf++;
}
printf("Client msg: %s\n", _out);
fflush(stdout);
shutdown(idntef, 2);
}
sbd 有提示吗,这里有什么需要改进的地方?
【问题讨论】:
-
while(*_buf != '\n' && x++ <= 512) {是错误的。您应该针对n变量进行测试。另外:无需将 511 字节读入 512 大小的缓冲区(if((n = read(idntef, _buf, 511)) < 0) {) -
在我的 Mac(运行 OS X 10.10.2)上,至少,echo | telnet 技巧不起作用;它会导致 telnet 连接,然后立即断开连接而不发送任何字符。
-
telnet是一个协议,它需要连接一个telnet进程。 (要执行一堆握手)独立的“read()”将无法正确设置 telnet 连接。
-
这是一个远程登录“问题”,在此处描述:stackoverflow.com/questions/7013137/automating-telnet-session-using-bash-scripts @JeremyFriesner 这对我有用:{ echo "Test" ;睡觉1; } |远程登录
-
@user3629249 不过,如果被测程序不介意看到偶尔出现的 telnet 命令字符,则可以使用 telnet 客户端对(非 telnet)基于 ASCII 的 TCP 协议进行故障排除。跨度>