我正在尝试编写一个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服务器
非常感谢提前
答案 0 :(得分:2)
连接到telnet服务器时,必须遵守telnet协议。虽然telnet连接可能看起来像纯文本发送/接收,但它确实是一个额外的协议。每次收到0xff时,这都是一个telnet转义码。有些情况:
因此,在您的情况下,服务器会向您发送DO(TerminalType = 0x18),DO(TerminalSpeed = 0x20),DO(XDisplayLocation0x23)和DO(NewEnvironmentOption = 0x27)。您应该使用WILL(...)或WONT(...)回复。无论如何要获取真实数据,你必须过滤掉telnet协议部分。
以下是一些有趣的链接: