19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
1

"Первый блин" при работе с сокетами

20.12.2011, 23:31. Показов 1502. Ответов 9
Метки нет (Все метки)

Всем здрасьте. Начал учится работы с сокетами. Конечная цель: автоматизация процессов через порт телнета разных модемов/роутеров. Но до этого длинный путь, не могу тупо приконнектиться к устройству. Помогите пожалуйста.
Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <winsock2.h>
#include <windows.h>
 
#define PORT 23
#define SERVERADDR "192.168.1.1"
 
int main ( int argc, char* argv [ ] )
{
    char buff[1024];
    printf("TCP Client \n");
    //WSAStartup(Ver, lpWSAData)
    if (WSAStartup (0x202, (WSADATA*)&buff[0]))
     {
                   printf("WSAStart error %d \ ", WSASGetLastError( ));
                   return -1;
     }
 
    SOCKET my_socket;
    my_socket=socket(AF_INET, SOCKET_STREAM, 0);
    
    if (my_socket < 0)
     {
                  printf ("Socket () error %d \n", WSAGetLastError());
                  return -1;
     }
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons (PORT);
    HOSTENT *hst;
    if (inet_addr(SERVERADDR) != INADDR_NONE)
        dest_addr.sin_addr=inet_addr(SERVERADDR);
    else
       {
        printf ("invalid address %s \n", SERVERADDR);
        closesocket (my_socket);
        WSACleanup();
        return  -1;
       }
    if (connect(my_socket,( sockaddr*)&dest_addr,sizeof(dest_addr)))
       {
        printf("Connect error  %d \n",WSAGetLastError());
        return -1;
       }
 
    printf(SERVERADDR);
           
    int nsize;
        while((nsize=recv(my_socket,&buff[0],sizeof(buff)-1,0)) != SOCKET_ERROR)
            {  
             buff[nsize] = 0;
             printf (" S=>C: %s ", buff);
             printf ("S<=C: ") ;
             fgets (&buff[0], sizeof( buff )-1, stdin);
             if (!strcmp(&buff [0], "quit \n "))
                 {
                  printf (" Exit ");
                  closesocket(my_socket);
                  WSACleanup();
                  return 0;
                 }
             send ( my_socket, &buff [ 0 ], nsize, 0 ) ;
             }
 
        printf (" Recv error  %d \n",WSAGetLastError());
        closesocket(my_socket) ;
        WSACleanup();
        return -1;
}
Вот несколько "камней", я бы даже сказал булыжников (цифра в начале строчка в коде),:
17:27 [Warning] '\040'
In function `int main(int, char**)':
17 `WSASGetLastError' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
23 `SOCKET_STREAM' undeclared (first use this function)
35 no match for 'operator=' in 'dest_addr.sockaddr_in::sin_addr = inet_addr(((const char*)"192.168.1.1"))'
note %\winsock2.h:223 candidates are: in_addr& in_addr::operator=(const in_addr&)

Сильно не бейте, не откажусь от статей/литературе по теме.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2011, 23:31
Ответы с готовыми решениями:

Ошибка "неопределенная ссылка" при работе с std::thread
При попытке сделать что-либо с std::thread, выдает ошибку компиляции, &quot;неопределенная ссылка &quot; . ...

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd"
вот код, нужно найти 3 минимальных положительных числа в массиве. При размере массива больше 950 в...

Найти в строке последовательность символов ("abcd") и заменить ее другой ("xyz")
Найти в строке последовательность символов (&quot;abcd&quot;) и заменить ее другой (&quot;xyz&quot;).

О "нестабильности" или "переполнении" цикла foreach
Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь: оказывается, что...

9
115 / 115 / 39
Регистрация: 11.10.2011
Сообщений: 649
20.12.2011, 23:41 2
В 17 строке неправильно написано название функции, возвращающей ошибку. Должно быть WSAGetLastError().
В 23 строке
C++
1
2
my_socket=socket(AF_INET, SOCK_STREAM, 0);
//SOCK_STREAM ïîòîêîâûé ñîêåò
Мануал по теме https://www.cyberforum.ru/atta... 1321701070
1
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
21.12.2011, 00:09  [ТС] 3
Heidel, Спасибо!

Осталось совсем чуть чуть:
36 no match for 'operator=' in 'dest_addr.sockaddr_in::sin_addr = inet_addr(((const char*)"192.168.1.1"))'
note %\include\winsock2.h:223 candidates are: in_addr& in_addr::operator=(const in_addr&)

Чего то ему #define SERVERADDR "192.168.1.1" не нравится. Как раз в том месте, где ip преобразуется из символьного в сетевой формат. =\ + в том же районе ругается вообще на какой-то конфликт операторов в модуле >_<. ip получается у нас константа, при преобразовании он случайно не должен быть указателем?
p.s.
Забыл скачать, в этом случае пользуюсь Dev-C++ 4.9
0
593 / 531 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
21.12.2011, 00:51 4
C
1
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
1
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
21.12.2011, 01:12  [ТС] 5
Спасибо! Можете чюють чють, рассказать суть ошибки?

Добавлено через 10 минут
________________________________+
Mission accomplished! The next level...|
________________________________+

Компиляция выдает не однозначные ругательства на наши выполнения:

`WSAStartup@8'
`WSAGetLastError@0'
`socket@12'
`htons@4'
`inet_addr@4'
`inet_addr@4'
`closesocket@4'
`WSACleanup@0'
`connect@12'
`WSAGetLastError@0'
`recv@16'
`closesocket@4'
`WSACleanup@0'
`send@16'
`WSAGetLastError@0'
`closesocket@4'
`WSACleanup@0'
ld returned 1 exit status

Это лечится? По мимо средств с чтением тематической литературы, что само собой уже в процессе ^_^
0
593 / 531 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
21.12.2011, 01:37 6
лечится
пролинковать надо библиотеки. ищи в настройках ... и укажи путь.
надо подключить библиотеку ws2_32.lib

"Спасибо! Можете чюють чють, рассказать суть ошибки?" ты всей структуре пытался присвоить а надо полю.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11050 / 6996 / 1657
Регистрация: 25.07.2009
Сообщений: 12,764
21.12.2011, 16:39 7
Цитата Сообщение от OstapBender Посмотреть сообщение
надо подключить библиотеку ws2_32.lib
Bumerang, если в настройках так и не нашлось (а оно там есть на самом деле ), в мелкостудии в начале программы после заголовков
C++
1
#pragma comment(lib, "ws2_32")
или в командной строке
Код
cl /EHsc prog.cpp ws2_32.lib
Если компилируете с gcc, в командной строке
Код
g++ -o prog prog.cpp -lws2_32
или как-то так...
1
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
21.12.2011, 18:01  [ТС] 8
easybudda, спасибо.
Но, ...
Использовал первый вариант в Visual (следующие два не совсем пойму как в консоли мелкомягких найти gcc или g++. В линукс не делаю, потому что результат нужен под "окном") добавил, при компиляции выдается общая ошибка:
1>LINK : fatal error LNK1104: не удается открыть файл "user3.lib". (Я его сначала удалил, появилась ошибка описанная ниже. Я подумал, что она вызвана удалённой либой и вернул обратно. но ситуация не изменилась.)
После взял пересоздал проект и результат с ошибкой:
Консоль запускается, успеваю заметить вывод на экран:
TCP Client
После перечень ругательств, соответственно не открывшиеся файлы я проверил в каталоге системы, которые там есть. Запускаю из под Windows XP:
"a.exe": Загружено: "C:\VC\a\Debug\a.exe", Символы загружены.
"a.exe": Загружено: "I:\WINDOWS\system32\ntdll.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\kernel32.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\ws2_32.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\advapi32.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\rpcrt4.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\secur32.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\msvcrt.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\ws2help.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\msvcr100d.dll", Символы загружены.
"a.exe": Загружено: "I:\WINDOWS\system32\mswsock.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\hnetcfg.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\gdi32.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\user32.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\imm32.dll", Невозможно найти или открыть файл PDB
"a.exe": Загружено: "I:\WINDOWS\system32\wshtcpip.dll", Невозможно найти или открыть файл PDB
Программа "[728] a.exe: Машинный код" завершилась с кодом -1 (0xffffffff).
Листинг
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>

#pragma comment(lib, "ws2_32")

#define PORT 23
#define SERVERADDR "127.0.0.1"

int main ( )
{
char buff[1024];
printf("TCP Client \n");
//WSAStartup(Ver, lpWSAData)
if (WSAStartup (0x202, (WSADATA*)&buff[0]))
{
printf("WSAStart error %d ", WSAGetLastError( ));
return -1;
}

//Если функция завершилась успешно то она возвращает дескриптор сокета.
SOCKET my_socket;
my_socket=socket(AF_INET, SOCK_STREAM, 0);

if (my_socket < 0)
{
printf ("Socket () error %d \n", WSAGetLastError());
return -1;
}
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons (PORT);
HOSTENT *hst;
if (inet_addr(SERVERADDR) != INADDR_NONE)
//dest_addr.sin_addr=inet_addr(SERVERADDR);
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);

else
{
printf ("invalid address %s \n", SERVERADDR);
closesocket (my_socket);
WSACleanup();
return -1;
}
if (connect(my_socket,( sockaddr*)&dest_addr,sizeof(dest_addr)))
{
printf("Connect error %d \n",WSAGetLastError());
return -1;
}

printf("Соединение с %s успешно установлено \n", SERVERADDR);

int nsize;
while((nsize=recv(my_socket,&buff[0],sizeof(buff)-1,0)) != SOCKET_ERROR)
{
buff[nsize] = 0;
printf (" S=>C: %s ", buff);
printf ("S<=C: ") ;
fgets (&buff[0], sizeof( buff )-1, stdin);
//После того, как ввели слово quit, выходим.....
if (!strcmp(&buff [0], "quit \n "))
{
printf (" Exit ");
closesocket(my_socket); //выход правильный
WSACleanup();
return 0;
}
send ( my_socket, &buff [ 0 ], nsize, 0 ) ;
}

printf (" Recv error %d \n",WSAGetLastError());
closesocket(my_socket) ;
WSACleanup();
return -1;
}

прошу любой помощи, критики и советов.
... --- ...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11050 / 6996 / 1657
Регистрация: 25.07.2009
Сообщений: 12,764
21.12.2011, 18:23 9
Цитата Сообщение от Bumerang Посмотреть сообщение
Я его сначала удалил
В смысле - сам файл с диска из c:\program files\microsoft visual studio\где_он_там...? Смело...
Цитата Сообщение от Bumerang Посмотреть сообщение
как в консоли мелкомягких найти gcc или g++
Win(кнопка с флажком)+Pause, закладка "дополнительно", там кнопка "переменные среды", к PATH через точку с запятой дописать c:\mingw\bin (ну или куда там у Вас gcc установлен), после этого исходники и в студийной консоли будут gcc компилироваться. А cl в той самой студийной консоли и так должен быть доступен (это как-раз мелкокомпилятор).

Цитата Сообщение от Bumerang Посмотреть сообщение
Невозможно найти или открыть файл PDB
Это какие-то приколы студийного отладчика. Попробуйте начать отсюда, может что и прояснится...
1
19 / 19 / 5
Регистрация: 05.12.2008
Сообщений: 157
23.12.2011, 01:50  [ТС] 10
easybudda, немного оговорился ^_^, удалил из списка подключенных файлов в настройке Visual.

___________________________________+
Mission accomplished! The level three... |
___________________________________+

Добавлено через 13 минут
Адрес подключения был, localhost.
Подключаюсь к D-Link роутеру, подключается удачно, но проблема с кириллицей:
TCP Client
╤юхфшэхэшх ё 192.168.1.1 єёях°эю єёЄрэютыхэю
S=>C: *¤☺*¤!*√☺*√♥ S<=C:
S=>C: BCM96338 ADSL Router
Login: S<=C: admin
S=>C:
Password: S<=C: admin
S=>C:
Login incorrect. Try again.
Login: admin
Password:
Login incorrect. Try again.
Login: ord: S<=C:
Подскажите что применить, что бы отображение было нормальное, что хотя не кретично. Важнее что бы команды передавались понятно для устройства.

Добавлено через 2 часа 14 минут
Ребят, поделитесь мыслями пожалуйста? подскажите как в программе задать последовательную передачу необходимых параметров, а не в ручную через консоль?

Добавлено через 2 часа 16 минут
Вопрос актуален. На гуглить, на мануалить не получается
Проблема с авторизацией...

Добавлено через 8 часов 41 минуту
Кто ни будь сможет намекнуть, почему через сокет-клиент не получается авторизоваться? Сервер просто не воспринимает данные аутентификации? Не правильно читает из-за испорченной кириллицы? Или из-за специфики сокета, читает первый символ логина/пароля?
Так, же помогите передать сокетом статические переменные логин/пароль через, к примеру, переменную. Увы у самого не получается, ибо еще не уверенно понимаю суть сокетов :-\
Очень рассчитываю на Ваши советы.

Добавлено через 6 часов 44 минуты
Не ужели ни у кого нету мыслей по этому поводу? Друзья, "help my"...

Добавлено через 7 часов 1 минуту
"Вопрос актуален."
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2011, 01:50

Ошибка: invalid conversion from "int" to "SDL_RendererFlip"
Скриншот приложен, Вот страница, откуда я брал этот код Подскажите что делать

Перестает "работать" сервер при повторном подключении клиента
Здравствуйте! Я совершенно недавно начал изучение С++ по этому столкнулся с проблемой которую не...

Ошибка "Signal received" при использовании taglib
Когда пытаюсь вывести id3v2-&gt;artist(или любое другое ), вне функции где инициализировал id3v2,...

Реализовать выход из многопоточного приложения при нажатии сочетания клавиш "Ctrl+С"
Добрый день! Подскажите пжл, как реализоввать выход с многопоточного(консольного) приложения по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.