Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > послать команду


Автор: Alexey68 19.7.2015, 01:54
Здравствуйте All!
Прошу помощи.
Необходимо сделать запрос whois (telnet whois.ripe.net 43), пробую так:
Код

char ip[] = "http://www.ripe.net";
void main()
{
WSADATA wsa;
int error, port;
SOCKET s;
SOCKADDR_IN a;
port = 43;

    WSAStartup(0x0101,&wsa);
    a.sin_family = AF_INET;
    a.sin_addr.s_addr = inet_addr(ip);
    s = socket(AF_INET,SOCK_STREAM,0);
    a.sin_port = htons(port);
    error = (connect(s,(sockaddr*)&a,sizeof(a)));

send(s, "google.com\r\n", message_size, 0);// тут у меня наверное ошибка...

char buffer[10000];
int buffer_size = sizeof(buffer);
buffer_size = recv(s, buffer, buffer_size, 0);

printf("from_server: %s\n", buffer);

но соединения не происходит.
Также при приёме функцией recv, программа перестаёт отвечать...
Подключаюсь к своему роутеру на порт 23:
Код

while(buffer_size > 0)
{
buffer_size = recv(s, buffer, 255, 0);
printf("%s", buffer);
}
выводит в консоль Login: и зависает.

Что у меня неправильно?
С уважением Алексей.

Автор: tzirechnoy 19.7.2015, 15:17
Цитата
Что у меня неправильно?


Коды возврата функцый не проверяешь.

Автор: feodorv 19.7.2015, 19:56
Цитата(Alexey68 @  19.7.2015,  01:54 Найти цитируемый пост)
char ip[] = "http://www.ripe.net";

Цитата(Alexey68 @  19.7.2015,  01:54 Найти цитируемый пост)
    a.sin_addr.s_addr = inet_addr(ip);

Что-то я сомневаюсь, что inet_addr() переваривает префикс протокола "http://". Какое значение возвращает этот вызов?


Цитата(Alexey68 @  19.7.2015,  01:54 Найти цитируемый пост)
send(s, "google.com\r\n", message_size, 0);// тут у меня наверное ошибка...

Чему равно message_size?


Цитата(Alexey68 @  19.7.2015,  01:54 Найти цитируемый пост)
но соединения не происходит.

Сложно судить о том, что происходит или происходит, поскольку никакой дополнительной информации на экран не выводится. Как минимум:
Цитата(tzirechnoy @  19.7.2015,  15:17 Найти цитируемый пост)
Коды возврата функций не проверяешь. 


Цитата(Alexey68 @  19.7.2015,  01:54 Найти цитируемый пост)
Подключаюсь к своему роутеру на порт 23:
    
while(buffer_size > 0)
{
buffer_size = recv(s, buffer, 255, 0);
printf("%s", buffer);
}

выводит в консоль Login: и зависает.

Ну потому что нужно и что-то посылать роутеру (тот же логин), а не только ждать от него приёма.

Автор: Alexey68 20.7.2015, 13:24
после вызова:
error = (connect(s,(sockaddr*)&a,sizeof(a)));
error возвращает 0,

сейчас пробую так:

Код

char ip[] = "192.168.0.1";

void main()
{
WSADATA wsa;
int error, port;
SOCKET s;
SOCKADDR_IN a;
port = 43;
    WSAStartup(0x0101,&wsa);
    a.sin_family = AF_INET;
    a.sin_addr.s_addr = inet_addr(ip);
    s = socket(AF_INET,SOCK_STREAM,0);
    a.sin_port = htons(port);
    error = (connect(s,(sockaddr*)&a,sizeof(a)));

while (buffer_size > 0)
{    
buffer_size = recv(s, buffer, 255, 0);
printf("%s", buffer);
printf("\nSize = %d\n", buffer_size);
}

сейчас выводит: 
D-LINK Login:
Size = 115 
и также (наверное) ждёт ответа.
>>Ну потому что нужно и что-то посылать роутеру (тот же логин)
>>, а не только ждать от него приёма. 
Как мне послать логин?
Также интересует как принудительно разорвать содинение после приглашения на ввод логина? 

Автор: feodorv 20.7.2015, 23:17
Цитата(Alexey68 @  20.7.2015,  13:24 Найти цитируемый пост)
сейчас выводит: 
D-LINK Login:
Size = 115 

115 байт - это много. А "D-LINK Login:" - это всего 13 байт, остальные байты в норме?

Цитата(Alexey68 @  20.7.2015,  13:24 Найти цитируемый пост)
Как мне послать логин?

Через send:
Код

if( send( s, "login\n", sizeof("login\n")-1, 0) == SOCKET_ERROR )
{
  printf( "send() error\n" );
  exit(-1);
}


где "login" - имя на вход. Может быть, понадобится "\r\n" на конце послания вместо просто "\n", но я не уверен.

Автор: Alexey68 27.7.2015, 05:17
Цитата(feodorv @ 20.7.2015,  23:17)
Цитата(Alexey68 @  20.7.2015,  13:24 Найти цитируемый пост)
сейчас выводит: 
D-LINK Login:
Size = 115 

115 байт - это много. А "D-LINK Login:" - это всего 13 байт, остальные байты в норме?

Цитата(Alexey68 @  20.7.2015,  13:24 Найти цитируемый пост)
Как мне послать логин?

Через send:
Код

if( send( s, "login\n", sizeof("login\n")-1, 0) == SOCKET_ERROR )
{
  printf( "send() error\n" );
  exit(-1);
}


где "login" - имя на вход. Может быть, понадобится "\r\n" на конце послания вместо просто "\n", но я не уверен.


Благодарю за помощь, "\r\n" всё принимает, пробую разорвать содинение, но никак не выходит.
>> А "D-LINK Login:" - это всего 13 байт, остальные байты в норме?
всё нормально.
Посылаю:
Код

send(s, "\x1D\r\n", 3, 0);//ctrl + [

но соединение не обрывается (telnet). В остальном всё как положено.
p.s. извиняюсь за отнятое время.

Автор: feodorv 30.7.2015, 14:10
Цитата(Alexey68 @  27.7.2015,  05:17 Найти цитируемый пост)
но соединение не обрывается (telnet)

Так либо тупо closesocket(), либо послать команду "exit".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)