Об IRC. Доступно и со вкусом.

DCC Протокол и возможные ошибки

В этой статье постараемся постараемся понять, что такое и как работает DCC (Direct Client Connection), и рассмотрим наиболее известные проблемы DCC протокола при использовании в mIRC. Всю нижеизложенную информацию можно применить и ко всем остальным IRC клиентам, несмотря на то, что упор в данной статье будет именно на mIRC.
DCC Протокол и его ошибки

В этой статье постараемся постараемся понять, что такое и как работает DCC (Direct Client Connection), и рассмотрим наиболее известные проблемы DCC протокола при использовании в mIRC. Всю нижеизложенную информацию можно применить и ко всем остальным IRC клиентам, несмотря на то, что упор в данной статье будет именно на mIRC.

Часть 1 - DCC Протокол
DCC соединение начинается с того, что один клиент, назовем его Клиент А подключается к IRC серверу и начинает прослушивание определенного порта. Затем он шлет CTCP запрос Клиенту Б, получателю DCC соединения. CTCP запрос содержит тип соединения, информацию (такую как название файла и размер), IP адрес и прослушиваемый порт Клиента А.
Если Клиент Б получает CTCP запрос, обычно в настройках указывается, что при этом необходимо будет сделать: принять запрос, проигнорировать запрос, спросить юзера. Если юзер примет DCC запрос, Клиент Б ожидает установки TCP соединения к указанному Клиентом А в CTCP соединении IP и порту. Если Клиент Б успешно установит соединение, DCC соединение можно продолжать.
Следует отметить, что Клиент Б не шлет ничего в ответ, если он отклоняет запрос, следовательно Клиент А должен подождать какое-то время, а затем сбрасывает соединение. Это называется таймаут. Время таймаута возможно изменять, но не стоит его делать слишком большим.

Основные виды CTCP запросов:
Для DCC Чата: PRIVMSG ClientB :DCC CHAT Chat longip port
Для DCC Отсылки: PRIVMSG ClientB :DCC SEND filename longip port filesize

Существует также еще несколько видов запросов, например для продолжения приемки файла или еще несколько альтернативных способов для установления DCC соединения, если захотите, то самостоятельно поищите нужную информацию, например в файле помощи по mIRC в разделах DCC Resume Protocol, DCC Server Protocol или DCC Socks5 Protocol.
Часть 2 – Ошибки и проблемы DCC протокола в mIRC
Для начала соединяемся с IRC сервером. Затем пишем: //dns $me, а затем //echo -a $ip
Если ваш IP адрес, возвращенный командой //echo, соответствует следующим маскам - 192.168.*.*, 10.*.*.*, или между 172.16.0.0 и 172.31.255.255, тогда пропустите следующие два параграфа.
Если же оба IP адреса одинаковые, тогда скорее всего дело в установленном в системе firewall. Если вы используете Windows XP, попробуйте выключить встроенный firewall. Если же вы используете сторонний firewall, например Zone Alarm, Tiny/Kerio Personal Firewall и т.д., проверьте в них разрешено ли mIRC прослушивать соединения.
Если же оба IP адреса неодинаковые, вводим команду /localinfo -u (когда соединены!), а затем вводим //echo -a $ip снова. Если команда вернет IP, соответствующий любому из DNS, можете продолжать. Попробуйте установить DCC чат с кем-нибудь. И еще, если вы можете установить DCC чат, вы также сможете посылать файлы по DCC.
Если вы не можете установить DCC чат или ваш IP соответствует одному из вышеизложенных видов, тогда скорее всего вы используете для соединения один из видов сети. Многие DSL и другие кабельные модемы используют сеть по умолчанию. Вам следует полистать мануал, чтобы узнать как перекинуть один порт на другой. Если же вы знаете то “прикрепите” 113, 59, и 1500-1510 порты к вашему “внутреннему” IP адресу. Порт 113 используется для идентификации, некоторые сервера запрещают соединения, если данный порт у вас не доступен. Порт 59 – по умолчанию считается портом DCC сервера. Если ваш друг не может послать вам файл, введите /dccserver +s on 59 и он сможет послать вам файл, используя /dcc send ваш_ip. Также для получения “внутреннего” IP используйте Пуск – Выполнить – winipcfg, а если вы используете Windows (2000, NT, и т.д.) вам следует использовать команду ipconfig. Если вам не нравится такой способ, введите в mIRC /localinfo –h, затем //echo -a $ip. Только не забудьте после этого ввести /localinfo –u, для установки всего на свои места.
Если вы перекинули порты, вам следует также сконфигурировать mIRC под них. Открываем опции mIRC (alt+o), открываем ветку 'Connect(Подключение)', в нем ищем 'Options(Настройка)', затем нажимаем кнопку 'Advanced…(Дополнительно)'. Устанавливаем 'Port range for connections' как указано ниже:
Первый: 1500
Последний: 1510
Убедитесь, что чекбоксы 'DCC' и 'Use random ports' включены.
После всего проделанного, потестите DCC чат с другим юзером. Если соединение не установится, прочитайте еще раз параграф про firewall или проверьте еще раз корректно ли были переназначены порты и проверьте диапазон портов в настройках DCC.
Следует отметить и еще один факт, что если DCC чат успешно устанавливается, а DCC отсылка до сих пор не работает, проблема в получателе. Вам обоим следует выключить DCC игнор (в mIRC команда /dcc ignore off), добавить друг друга в DCC список исключений (/dcc trust {nick|address}), а в сетях наподобие Dalnet, еще понадобится ввести команду (например /dccallow +theirnick).
Если же вы на работе, в школе, университете, библиотеке и т.д. и не имеете доступа к конфигурированию настроек как системы, так и различных firewall, то тут есть два способа отсылки файлов. Тем не менее, оба эти способа подразумевают, что юзер, которому вы шлете файлы, принимает соединения.
Метод1: использовать DCC сервер. Юзер получатель должен ввести /dccserver +s on port, где port – порт для получения соединений, по умолчанию 59. Затем, узнайте IP адрес юзера командой /dns nick или спросить его  и наконец ввести /dcc send theirip [file], где theirip – ip юзера, [] в названии файла означает, что можно и не указывать имя файла, тогда появится диалог с выбором файла.
Метод2: намного проще. Т.к. уже начиная с версии mIRC 6.17, автор ввел опцию конфигурирования пассивных DCC отсылок. Используйте /dcc passive {on|off} для включения или выключения их. Использование пассивных DCC запросов добавляет дополнительный параметр к DCC сообщению. Если получатель поддерживает пассивные DCC, он вернет вам DCC сообщение с его IP адресом и прослушиваемым портом, к которому вам следует соединяться. К сожалению не все IRC клиенты поддерживают этот метод.

Часть 3 - Скрипт WhatIsMyIp.com
Используйте этот скрипт для корректной установки вашего IP, когда вы используете сетевое соединение с Интернетом, но используете bnc или другой вид прокси.
; myndzi © / v1.0
; whatismyip.com автоматически конфигурирует локальную информацию
; введите /wimip для установки информации
; Вставлять в Remote(Ремоуты/Скрипты)

; при старте mIRC выключаем группу #wimhost
on *:start: .disable #wimhost

; алиас запуска скрипта, закрываем сокет(вдруг он открыт) и устанавливаем соединение с сайтом
alias wimip sockclose wimip | sockopen wimip www.whatismyip.com 80

; при открытии нашего сокета
on *:sockopen:wimip:{
; если ошибка вырубаемся
if ($sockerr) return
; отсылаем HTTP запрос
sockwrite -n $sockname GET / HTTP/1.1
sockwrite -n $sockname Host: www.whatismyip.com
sockwrite -n $sockname
}

; при получении инфы с сокета
on *:sockread:wimip:{
; если ошибка вырубаемся
if ($sockerr) return
читаем все из сокета в переменную %t
var %t | sockread %t
; читаем до конца инфы
while ($sockbr) {
; если маска есть в переменной
if (*** iswm %t) {
; считываем 4 токен из переменной
var %ip = $gettok(%t,4,32)
; устанавливаем найденный ip
localinfo $iif($host == $null,%ip,$host) %ip
; закрываем сокет
sockclose $sockname
; врубаем группу
.enable #wimhost
; чекаем ip
.timer 1 0 .dns $ip
return
}
sockread %t
}
}

on *:sockwrite:wimip:if ($sockerr) return
on *:sockclose:wimip:if ($sockerr) return

#wimhost off
; при dns запросе
on *:dns:{
; если ip запроса и наш айпи совпадают вырубаем группу
if ($dns(1).ip == $ip) .disable #wimhost
; если возвращаемый адрес не пустой, устанавливаем его
if ($dns(1).addr != $null) localinfo $dns(%i).addr $ip
; возвращаем данные
echo -st Local host: $host ( $+ $ip $+ )
}
#wimhost end

При написании статьи была использована информация с сайта mircscripts.org