从远程服务器接收给出垃圾字符?

时间:2014-06-10 11:34:36

标签: c++ c linux telnet

我正在尝试编写一个telnet客户端来连接到以下服务器:

198.182.241.14(主办:匹兹堡州立大学,堪萨斯州,美国) - 登录:图书馆

我已通过以下代码成功连接;

sd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in sin;
memcpy(&sin.sin_addr.s_addr, host->h_addr, host->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(portno);
if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
    printf("error .. connecting sockets\n");
    return bRet;
}
printf("connected...\n");

然后我发送“库”作为密码(据我所知,我必须输入密码硬编码)

但是收到的时候,我得到了一些垃圾字符:然后在下次收到它时被绞死了:

char buf[2048] = {0};
send(sd, command, strlen(command),0);
send(sd, (void*)"\n",2,0);

这里的命令是“library”

这发送7个字节,但之后我的例外是从服务器接收一些数据:

** PSU Library Consortium - 选择要搜索的库  1. PSU Axe Library目录 ......还有更多*

我通过以下代码收到:

while(1)
{
    memset(buf, 0, 2048);
    int rv = recv(sd , buf , 2048 , 0);
    printf("received %d\n",rv);
    if (rv < 0)
        return false;
    else if (rv == 0) {
        printf("Connection closed by the remote end\n\r");
        return 0;
    }
    buf[rv] = '\0';
    printf("%s\n",buf);
    for(int i =0;i<strlen(buf);i++)
    {
        printf("%c = %d = 0x%08x\n",buf[i], buf[i], buf[i]);
    }
}

这是打印一些垃圾字符如下:

ÿýÿý ÿý#ÿý'
ÿ = -1 = 0xffffffff
ý = -3 = 0xfffffffd
 = 24 = 0x00000018
ÿ = -1 = 0xffffffff
ý = -3 = 0xfffffffd
  = 32 = 0x00000020
ÿ = -1 = 0xffffffff
ý = -3 = 0xfffffffd
# = 35 = 0x00000023
ÿ = -1 = 0xffffffff
ý = -3 = 0xfffffffd
' = 39 = 0x00000027
received 0
Connection closed by the remote end

任何帮助?

更多编辑:任何好文章/书籍参考/完整代码示例 - 这样我就可以从套接字编程开始并通过密码成功登录telnet服务器

非常感谢提前

1 个答案:

答案 0 :(得分:2)

连接到telnet服务器时,必须遵守telnet协议。虽然telnet连接可能看起来像纯文本发送/接收,但它确实是一个额外的协议。每次收到0xff时,这都是一个telnet转义码。有些情况:

  • 0xff 0xff =转义为0xff数据字节
  • 0xff 0xfd = DO,后跟选项代码

因此,在您的情况下,服务器会向您发送DO(TerminalType = 0x18),DO(TerminalSpeed = 0x20),DO(XDisplayLocation0x23)和DO(NewEnvironmentOption = 0x27)。您应该使用WILL(...)或WONT(...)回复。无论如何要获取真实数据,你必须过滤掉telnet协议部分。

以下是一些有趣的链接: