Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с WinSock2, inet_pton не найдена в ws2_32.dll 
:(
    Опции темы
andrew_121
  Дата 29.5.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Программа с использованием сокетов. Компилируется, линкуется, а при попытке запустить, сообщает:
Точка входа в процедуру inet_pton не найдена в библиотеке ws2_32.dll
Т.е. Я так понимаю, что сама длл-ка есть, но в ней нет этого экспорта. Почему же он есть в библиотеке экспорта?



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
REZiaMIX
Дата 29.5.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



inet_addr не тоже самое?


--------------------
user posted image
PM MAIL   Вверх
andrew_121
Дата 29.5.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(REZiaMIX @  29.5.2009,  15:34 Найти цитируемый пост)
inet_addr не тоже самое? 

Думаю нет. Да и вопрос не в этом.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 29.5.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



http://msdn.microsoft.com/en-us/library/cc805844(VS.85).aspx
хочу обратить внимание на это
Цитата

Minimum supported client    Windows Vista
Minimum supported server    Windows Server 2008
Header    Ws2tcpip.h
Library    Ws2_32.lib
DLL    Ws2_32.dll
Unicode and ANSI names    InetPtonW (Unicode) and InetPtonA or inet_pton (ANSI)

PM   Вверх
andrew_121
Дата 29.5.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



azesmcar, Гм... А что вместо нее использовать? inet_addr как-то не то smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 29.5.2009, 17:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



andrew_121
смотря что нужно smile
это разные функции.
inet_addr - конвертирует в IN_ADDR, плюс он не работает с Ipv6.
Можно самому написать конвертер (или еще проще - скопировать из сорсов юникса)

http://www.koders.com/c/fid74A647B73741DDD...84E8740D43.aspx
http://www.samba.org/rsync/doxygen/head/in..._8c-source.html
вот сорс-код

Это сообщение отредактировал(а) azesmcar - 29.5.2009, 17:23
PM   Вверх
andrew_121
Дата 29.5.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



azesmcar, Спасибо! Ща попробую.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 29.5.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Не помогло.
В моем коде эта функция используется всего однажды. Я ее переименовал, и подсунул из сорца. Возможно она используется другими функциями из Sockets2.

Какие еще предложения?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
REZiaMIX
Дата 29.5.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



попробовать скачать библиотеку winsock2.dll от висты , вручную загрузить(getprocaddress) из нее функцию и переопределить дефайном(или перехватить).
Извращенно , но может прокатит :В

библиотека называеца ws2_32.dll

Это сообщение отредактировал(а) REZiaMIX - 29.5.2009, 19:17


--------------------
user posted image
PM MAIL   Вверх
andrew_121
Дата 29.5.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Я так и сделал. Скачал. Положил в каталог с программой. Но нет, не хочет ее использовать.
Вот думаю подменить стандартную виндовскую на эту, хз что произойдет smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
REZiaMIX
Дата 29.5.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Цитата(andrew_121 @ 29.5.2009,  19:17)
Я так и сделал. Скачал. Положил в каталог с программой. Но нет, не хочет ее использовать.
Вот думаю подменить стандартную виндовскую на эту, хз что произойдет smile

а если сделать FreeLibrary , а потом LoadLibrary с полным путем?


--------------------
user posted image
PM MAIL   Вверх
REZiaMIX
Дата 29.5.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Можно сделать LoadLibrary правильной DLL;
потом обявить самому эту функцию, и GetProcAddress(...).
Тогда 100% функция будет что надо ,но не факт что результат в общем будет правильным, и не факт что функция из dll висты заработает

По хорошему - тут надо искать другое , не каверзное решение.


--------------------
user posted image
PM MAIL   Вверх
azesmcar
Дата 29.5.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(andrew_121 @  29.5.2009,  18:03 Найти цитируемый пост)
Не помогло.
В моем коде эта функция используется всего однажды. Я ее переименовал, и подсунул из сорца. Возможно она используется другими функциями из Sockets2.

подробнее пожалуйста. Что должно было произойти, и что произошло.

Цитата(andrew_121 @  29.5.2009,  19:17 Найти цитируемый пост)
Вот думаю подменить стандартную виндовскую на эту, хз что произойдет smile  

лучше не надо
а вообще - подробнее о задаче, люди до появления висты писали программы под виндоуз и не жаловались на отсутствие этой функции. Почему она вдруг стала так жизненно важна?
PM   Вверх
andrew_121
Дата 29.5.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Перегрузился в Лин, подменил на вистовскую версию этой либы. Экран смерти. Вернул все как прежде.

Цитата(REZiaMIX @  29.5.2009,  19:18 Найти цитируемый пост)
а если сделать FreeLibrary , а потом LoadLibrary с полным путем? 

    Можно попробовать. Но я полагаю, что ХР версия этой длл-ки статически подгружается. Получится ли ее выгрузить...надо пробовать.

Цитата(REZiaMIX @  29.5.2009,  19:36 Найти цитируемый пост)
Можно сделать LoadLibrary правильной DLL;
потом обявить самому эту функцию, и GetProcAddress(...).
Тогда 100% функция будет что надо ,но не факт что результат в общем будет правильным, и не факт что функция из dll висты заработает

И это пробовал. Но как я понял, эту же функцию, наверное, используют другие функции из Socks2. Я выше писал. Цитирую:
Цитата
В моем коде эта функция используется всего однажды. Я ее переименовал, и подсунул из сорца. Возможно она используется другими функциями из Sockets2.


Цитата(azesmcar @  29.5.2009,  19:40 Найти цитируемый пост)
подробнее пожалуйста. Что должно было произойти, и что произошло.

Было: 
Цитата
Программа с использованием сокетов. Компилируется, линкуется, а при попытке запустить, сообщает:
Точка входа в процедуру inet_pton не найдена в библиотеке ws2_32.dll

Последовал вашему совету: 
Цитата
Можно самому написать конвертер (или еще проще - скопировать из сорсов юникса)

Все так и осталось.

Цитата(azesmcar @  29.5.2009,  19:40 Найти цитируемый пост)
лучше не надо

Уже понял)))
Цитата(azesmcar @  29.5.2009,  19:40 Найти цитируемый пост)
а вообще - подробнее о задаче, люди до появления висты писали программы под виндоуз и не жаловались на отсутствие этой функции. Почему она вдруг стала так жизненно важна?

Согласен. Программа в Лине работает. Нужно чтоб работала в Винде.

Вот smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 29.5.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(andrew_121 @  29.5.2009,  20:23 Найти цитируемый пост)
Было: 

Было, не то что я спрашивал

Цитата(andrew_121 @  29.5.2009,  20:23 Найти цитируемый пост)
Согласен. Программа в Лине работает. Нужно чтоб работала в Винде.

хотя тут я ответ получил smile 
Я собственно не понял, в чем проблема была? скопировал из сорсов линукса, 
1. функция откомпилировалась? Да/Нет.
2. тестировалась отдельно от проекта? Да/Нет.


Это сообщение отредактировал(а) azesmcar - 29.5.2009, 20:33
PM   Вверх
andrew_121
Дата 30.5.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(azesmcar @  29.5.2009,  20:33 Найти цитируемый пост)
Я собственно не понял, в чем проблема была? скопировал из сорсов линукса, 
1. функция откомпилировалась? Да/Нет.
2. тестировалась отдельно от проекта? Да/Нет.

1. Да.
2. Да.


Но при запуске все равно сообщает: Точка входа в процедуру inet_pton не найдена в библиотеке ws2_32.dll


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 30.5.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(andrew_121 @  30.5.2009,  10:57 Найти цитируемый пост)
Но при запуске все равно сообщает: Точка входа в процедуру inet_pton не найдена в библиотеке ws2_32.dll 

Следовательно в программе используется эта функция (не написанная, а именно виндоузовская), либо ее использует другая библиотека которую используешь ты.
1. Надо проверить, а точно ли она не используется в коде. Переименовать функцию и все ее вызовы, откомпилировать, проверить.
2. Если все еще не работает, проверить под дебагером кто использует функцию.
PM   Вверх
andrew_121
Дата 30.5.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(azesmcar @  30.5.2009,  19:05 Найти цитируемый пост)
1. Надо проверить, а точно ли она не используется в коде. Переименовать функцию и все ее вызовы, откомпилировать, проверить.

Во всем проекте, всего однажды.



Цитата(azesmcar @  30.5.2009,  19:05 Найти цитируемый пост)
2. Если все еще не работает, проверить под дебагером кто использует функцию.

Как? Чё дебагить то?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 30.5.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(andrew_121 @  30.5.2009,  19:27 Найти цитируемый пост)
Как? Чё дебагить то? 

Программу свою
http://www.ollydbg.de/

Это конечно в том случае, если логически вычислить виновника не получается.

Это сообщение отредактировал(а) azesmcar - 30.5.2009, 19:38
PM   Вверх
andrew_121
Дата 30.5.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



azesmcar, Так, минуточку! В моем коде эта функция используется всего однажды. Я ее заменил сорцом. Значит ее мне дебагить ненужно.
Так, вы что, предлагаете дебагить до тех пор пока я не встречу сию функцию? И что мне это даст? Я же не могу ее в длл-ке заменить. Или...?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 30.5.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(andrew_121 @  30.5.2009,  21:01 Найти цитируемый пост)
azesmcar, Так, минуточку! В моем коде эта функция используется всего однажды. Я ее заменил сорцом. Значит ее мне дебагить ненужно.

Если в своем коде ты ее заменил, значит ошибка выдаватся не должна. А если выдается - значит либо не везде заменил, либо используешь другую библитеку, которая использует эту функцию..Кто-то же на не ссылается что ошибка вылетает. Для начала я бы порекомендовал сделать полный ребилд проекта. Если не поможет, искать дебагером виновника. Т.е. запустить под дебагером и посмотреть, кто именно требует эту функцию. Сперва вычислить, а потом думать как исправить.
PM   Вверх
andrew_121
Дата 30.5.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Буду пробовать...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
REZiaMIX
Дата 31.5.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



ws2_32.dll линкуется динамически(и для каждого процесса она "своя").
я бы попробовал перехватить ее и заменить на свою. Должно поидее прокатить.
т.е. DWORD addr = (DWORD)&inet_pton;
Самое простое - заменить первые 5 байт , на jump на свою функцию.

Да и вообще , дал бы код программы где используется эта функция - наверняка ее очень легко заменить аналогом.
Врядли winsock2 будет её использовать без указаний извне smile 



--------------------
user posted image
PM MAIL   Вверх
andrew_121
Дата 31.5.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(REZiaMIX @  31.5.2009,  20:06 Найти цитируемый пост)
Самое простое - заменить первые 5 байт , на jump на свою функцию.

Подробней пожалуйста....



Цитата(REZiaMIX @  31.5.2009,  20:06 Найти цитируемый пост)
Да и вообще , дал бы код программы где используется эта функция - наверняка ее очень легко заменить аналогом.

Вот:
Код

/* Connect a client socket to a server socket */
bool Socket::connect(const LString& host, const int port) {
    if (!is_valid()) { return false; }

    m_addr.sin_family = AF_INET;
    m_addr.sin_port = htons(port);

    int status = inet_pton(AF_INET, host.c_str(), (unsigned char*)&m_addr.sin_addr);

#ifndef WIN32
    if (errno == EAFNOSUPPORT) { return false; }
#endif
    status = ::connect(m_sock, (sockaddr *) &m_addr, sizeof(m_addr));

    return (status == 0);
}




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
REZiaMIX
Дата 31.5.2009, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 3.11.2007

Репутация: нет
Всего: 4



Код


SOCKET getOutgoingSocket(char * addr,unsigned int PORT)
{
        SOCKET sock;
    sock = socket(AF_INET,SOCK_STREAM,0);
    if (sock == INVALID_SOCKET) 
        repsys::report("Error at socket(): %ld\n", WSAGetLastError());

    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
    HOSTENT *hst = NULL;


    if (inet_addr(addr)!=INADDR_NONE)
      dest_addr.sin_addr.s_addr=inet_addr(addr);
    else
      if (hst=gethostbyname(addr))
          ((unsigned long *)&dest_addr.sin_addr)[0]=
            ((unsigned long **)hst->h_addr_list)[0][0];
    hst=gethostbyname(addr);
    if(hst == NULL)
        repsys::report("DNS fail or invalid addr.\n");

    if(connect(sock,(sockaddr *)&dest_addr,sizeof(dest_addr)) )
                repsys::report("connect fail.\n");
    
    return sock;
}



Аналогичный код , + разрешение dns если адрес является не IP , а именем домена.
Используется inet_addr. repsys::report - функция лог ошибок.
Думаю ошибка возникает в коде не по причине inet_pton.

Какого рода вообще ошибка , не проще ли пройтись дебагом по программе , и посмотреть где что и как?
Думаю не идет коннект?!?!
(это моя старая функция , есть баг когда два раза вызывается gethostbyname, исправить просто булевой переменной где надо)
inet_addr вроде отличается только тем , что не справиться с ipv6(пока еще рано о нем думать по моему мнению).

Добавлено @ 00:09
Да и... Другими функциями из sockets2 (win xp) использоваться она ну никак не будет , если ее нету!

Так что надо искать ошибку в другом месте.

Это сообщение отредактировал(а) REZiaMIX - 1.6.2009, 00:10


--------------------
user posted image
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1916 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.