Это вряд ли будет проблемой с кодом (если WSAStartup
не особенно медленно).
первого вещь, которую я сделал бы, чтобы выводить время (желательно с точностью до миллисекунды, с GetTickCount
, я думаю) между каждым из этих строк в коде, чтобы точно выяснить, где время тратятся.
Возможно, gethostbyaddr
должен выйти на удаленную машину DNS для разрешения IP-адреса на имя хоста.
Если ваша сеть настроена плохо или DNS-сервер, содержащий этот адрес, находится в отдаленных регионах тибетских гор, например, разрешение будет займет некоторое время.
Из командной строки введите:
nslookup x.x.x.x
(где x.x.x.x
является IP-адрес вы заинтересованы в) и посмотреть, как долго это берет.
Основываясь на ваш комментарии между строками линеек ниже:
Я работаю в локальной сети с помощью всего 3 машины. Также эта сеть не подключена к Интернету. Это занимает 16 секунд (+/- некоторые миллисекунды) для только линии:
HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
в то время:
GetHostByName(PChar(HostName));
происходит мгновенно. Ниже выход Ping (мгновенный выход) и NSLOOKUP:
c:\> ping 192.168.1.22
Reply from 192.168.1.22: bytes=32 time<1ms TTL=128 Packets:
Sent = 4, Received = 4, Lost = 0 (0% loss)
c:\> nslookup 192.168.1.22
DNS request timed out.
Я думаю, ваша проблема с этим тайм-аут. Кажется, ваша сеть настроена для разрешения имен DNS, но не для IP-обратного разрешения.
Когда вы просто набираете nslookup
, он должен показать ваш DNS-сервер, который он пытается использовать, и это, вероятно, даст вам ключ.
c:\pax> nslookup
Default Server: pax01.neveryoumind.com
Address: 9.190.230.75
Возможно, что разрешение имен на IP-адреса не выходит через DNS, а вместо этого обрабатывается локальной информацией.
Это примерно такая же помощь, как я могу дать вам текущую информацию. Поскольку теперь это кажется очень вопросом суперпользователя, а не StackOverflow, я подталкиваю его туда.
Обычно это проблема DNS. – sje397
Обычно, да, но мы не будем знать наверняка, пока не получим тайминги из кода. В противном случае я бы сразу подтолкнул его к SU. – paxdiablo
Сравните «nslookup» с этим вызовом, посмотрите, сильно ли он отличается. Если это не так, то это определенно проблема DNS. –