私はtelnetで接続するC++プログラムを作っています。私はサーバーからの出力を取得するため、接続が機能しているようです。問題は、telnetに特定のコマンドを送る必要があることです。たとえば、コマンド:C++ WinSockがTelnetサーバにコマンドを送る
ログインユーザのパスワード
ジャスト()何もしていないようだ(または多分私が何か間違ったことをやっているが、それを見ていないセンド経由で送信します)。 ftp://ftp.rfc-editor.org/in-notes/rfc854.txtのページにいくつかの情報がありますが、私はそれを本当に理解していません。
誰かが私に例を示し、それを動作させるにはどうすればよいのか説明できますか? Googleにしようとしたが、私は本当に私が望むものを正確に見つけられなかった。私は文字通り2つのコマンドを送る必要があります。
は、ここで私は(ない完全なコード)をしようとしているものです:
int main() {
int iR;
std::string input;
std::cout << "Telnet ip: ";
std::getline(std::cin, input);
std::cout << std::endl;
u_long ip = 0;
u_short port = DEFAULT_PORT;
u_long * ptr = &ip
const char * cptr = input.c_str();
inet_pton(AF_INET, cptr, ptr);
std::cout << "Telnet port: ";
std::getline(std::cin, input);
std::cout << std::endl;
iR = std::stoi(input);
if((iR > SHRT_MAX) || (iR < 0)) {
std::cout << "Wrong port number, using default." << std::endl;
}
else {
port = iR;
}
WSADATA wsaData;
iR = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iR != 0) { return 1; }
SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server == INVALID_SOCKET) { WSACleanup(); return 1; }
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ip;
addr.sin_port = htons(port);
std::string user;
std::string pass;
std::cout << "Username: ";
std::getline(std::cin, user);
std::cout << std::endl; << "Password: ";
std::getline(std::cin, pass);
std::cout << std::endl;
std::cout << "Connecting..." << std::endl;
if ((connect(server, (SOCKADDR *)&addr, sizeof(addr))) == SOCKET_ERROR) {
std::cout << "Couldn't connect. << std::endl;
WSAcleanup();
Sleep(2000);
return 0;
}
int bRecv = 0;
char buff[2048];
bRecv = recv(server, buff, sizeof(buff), 0);
if ((bRecv == SOCKET_ERROR) || (bRecv == 0)) {
std::cout << "Disconnected from the server." << std::endl;
WSACleanup();
return 0;
}
buff[bRecv] = 0;
// When it connects successfully, a message appears on the screen from server
std::cout << buff << std::endl;
memset(buff, 0, sizeof(buff));
std::string command = "login ";
command.append(user);
command.append(" ");
command.append(pass);
cptr = login.c_str();
strcpy_s(buff, cptr);
iR = send(server, buff, (u_int)strlen(buff), 0);
if (iR == SOCKET_ERROR) { std::cout << "Couldn't send data." << std::endl; WSACleanup(); return 0;
while (true) {
bRecv = recv(server, buff, sizeof(buff), 0);
if ((bRecv == SOCKET_ERROR) || (bRecv === 0)) {
std::cout << "Disconnected from the server." << std::endl;
break;
}
buff[bRecv] = 0;
std::cout << buff << std::endl;
}
WSACleanup();
return 0;
}
私は間違った方法これをやっていないよ願う意味します。私はC++の初心者です。
を?彼らはGopherサーバーほど絶滅の危機に瀕しています。 – tadman
telnetコマンドは\ r \ nで終わる必要があります。私はあなたがそうしているのを見ない。 – SergeyA
@ tadman ts3 query – GorudoYami