![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
у меня два приложения, клиент и сервер. при доключении к серверу мне необходимо определять с каково ИПшника подключается клиент....
каким образом это можно сделать. -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Функции accept() и WSAAccept() в качестве параметра принимают addr (тип sockaddr *) - в нем и будет IP.
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
dim
sa_data после асепта содержит 52587 sa_family содержит бред как мне из этого получить ип -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
sockaddr - это общее представление адреса для сокетов (потому что адреса могут принадлежать разным семействам протоколов - напр. AF_IPX, и т.д.). Для семейства AF_INET используется структура sockaddr_in (а sockaddr - это общее представление каждой из этих структур). Поэтому если ты работаешь c AF_INET тебе всегда надо использовать sockaddr_in, а где указываестся sockaddr, просто приводить указатели к sockaddr_in*. Т. е:
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
я работаю с классами, асепт не принимет sockaddr_in в качестве параметра.
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Блин, так я же тебе говорю используй приведение типов и даже пример привел
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
сдела как ты говориш, все равно муру возвращает
пример ты дал с ошибкой accept(s, (sockaddr_in *)&addr, &addrlen); -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Насчет муры так ты наверно в host byte order формат не переводишь: есть функции ntohl() и ntohs() для перевода в host byte order. Кроме того есть функция inet_ntoa() для перевода IP в символьный формат.
Это сообщение отредактировал(а) dim - 11.2.2003, 05:26 --------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
dimМОЖЕТ ПРимер даш
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
поднимаю тему, помогите из sockaddr_in получить ИП адрес, ну не доходит до меня..
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Вот пример: консольная прога которая при запуске в качестве параметров принимает IP и порт на котором будет слушать. Когда ты коннектишься на ее IP и порт, то она выдает на консоль откуда произошел connection и закрывает его. Коннектиться можешь обычным telnet - ом.
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
возвращает адрес 204.204.204.204 это ж бред или я ошибаюсь
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
У меня - прекрасно работает. Расскажи что ты делаешь.
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
CSocket a;
CSocket b; вообщето они производные у меня это так пример a.create(2020); a.listen(); CSocket::onaccept(...) { sockaddr_in e Accept(&b,(sockaddr*)&e); // здесь просматриваю результат подключения и вижу 204.204.204.204 } -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Ну дак ведь ты самый интерсный участок пропустил, написав вместо него
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
там как раст втой инет_нтоа и стоит.
Кстати зачем нужен бинд, я его не использую, а в твоем примере он есть -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
bind привязывает сокет к определенной паре адрес - порт (замечу что можно еще привязать к всем IP на данном порту). У тебя он не вызывается, потому что CAsyncSocket делает это сам в вызове Create().
Приведи пожалуйста полноценный кусок кода на котором видно проблему, если только это не коммерческая тайна. --------------------
that's all |
||||
|
|||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Ну вот первое, что приходит на ум не проверяя - ты вызываешь Accept() и не проверяешь возвратился он с ошибкой или нет. Если он возвращает ошибку, то вполне логично, что в a будет какая-то фигня. Т.е. проверь не возникает ли ошибка, а вообще хороший стиль особенно если это сервер всегда проверять подобные ситуации.
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
dim если он вернется с ошибкой то у меня на экране не появиться окошко кторое отображает количество пересылаемых байт, оно создается из sol (см. код), нету sol - нет окошка, а оно появляется регулярно.
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Ну в таком случае вероятно ты где-то теряешь правильный алрес. Попробуй в том месте где ты отображаешь - sol.GetPeerName(...), а в качестве первого параметра - CString&
--------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
ок попробую, но завтра
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| keisik |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Вот такая штука вроде работает:
Здесь CSock производный от CAsyncSocket, а GetAcceptedPeer выглядит так:
--------------------
...None of that can stop us now,we will make it through somehow... |
||||
|
|||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
keisik Зачем так сложно, если во-первых работает inet_ntoa(), во-вторых getpeername()? Кроме того не понятно зачем вызывается gethostbyaddr(), что может привести к лишним накладным расходам.
--------------------
that's all |
|||
|
||||
| keisik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Я и не говорю, что это супероптимизированный вариант
Хотя, если нужен только АйПишник, то gethostbyaddr просто выкидывается. А по поводу накладных расходов - мне кажется, что лишний вызов GetPeerName не сильно от этого отличается. Ведь насколько я понимаю, всё равно эта инфа запрашивается, только разными способами? --------------------
...None of that can stop us now,we will make it through somehow... |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Вот тут ты сильно ошибаешься, поскольку для того чтобы получить IP нам ничего не надо - он сам приходит к нам уже в пакете - остаеся его только вытащить, а вот получение имени это лишнее обращение к системе имен (как правило DNS), что довольно накладно в обстоятельставх не требующих этих излишеств. --------------------
that's all |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
я что не делаю мне все время возвращает 204.204.204.204
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
Step ты бы структурку обнулил и посморел б результат...
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
мужики все получилось, просто я для асепта указывал объект сокета созданный в конструкторе, а надо было создавать в обрачеке он асепт, все получилось.
Все выражаю огромную благадарность. -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Гость_Yorik |
|
|||
|
Unregistered |
Мне как раз это и было нужно
Спасибо. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |