Иногда мой клиент не может связаться с моим сервером.
Когда это происходит, то на моем сервере я могу вручную ping
клиента, и теперь клиент может видеть сервер.
Мой вопрос: что можно сделать, чтобы это исправить, не используя ping
?
Я действительно надеюсь, что вы можете помочь пролить свет на эту спорадическую проблему. В плохой день это случается до 5 раз. В хороший день может быть 1 раз. В действительно хороший день проблем нет, но это редко.
Я занимаюсь разработкой своего проекта для свободного времени, который представляет собой приложение для iOS с сервером C ++. Это должно быть сделано с открытым исходным кодом в какой-то момент.
О моей настройке
И сервер, и клиент находятся на одном и том же Wi-Fi.
Оба устройства могут открывать www.google.com
в браузере, поэтому у них есть доступ к Интернету.
сервер
macOS version 10.11.6 - El Capitan
NGINX version 1.10.0
IP address: 192.168.0.13 (proxy disabled)
The server is not connected to the router via cable.
The NGINX server is running on port 12345 and controls a FastCGI script.
Ссылка на мою конфигурацию NGINX и имя хоста, ifconfig, resolv.
клиент
iPad Pro (I'm also experiencing the same problem with my iPhone)
iOS 9.3.5 (13G36)
IP address: 192.168.0.18 (proxy disabled)
The client is not connected to the server via cable.
маршрутизатор
Netgear CG3000, hardware version 1.04, software version 3.9.21.13.mp3.V1.32.02
I'm experiencing the same problem with other routers, can't remember which ones.
Ничего не записано в журнал событий роутера.
Действия по воспроизведению
Я иду через эти шаги.
Шаг 1: Клиент не может связаться с сервером
На клиенте:
В браузере я набираю IP-адрес сервера и порт: http://192.168.0.13:12345/status
Но ничего не происходит. Клиент не может связаться с сервером.
Клиент может получить доступ к Интернету просто отлично.
Шаг 2: Клиент pinging сервера - заставляет вещи работать
На сервере:
Я ping
клиента по его IP-адресу, вот так
PROMPT> ping 192.168.0.18
PING 192.168.0.18 (192.168.0.18): 56 data bytes
64 bytes from 192.168.0.18: icmp_seq=0 ttl=64 time=102.210 ms
64 bytes from 192.168.0.18: icmp_seq=1 ttl=64 time=102.966 ms
64 bytes from 192.168.0.18: icmp_seq=2 ttl=64 time=21.176 ms
^C
--- 192.168.0.18 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 21.176/75.451/102.966/38.379 ms
PROMPT>
Эта команда ping
обеспечивает доступ клиента к серверу.
Почему ping
заставляет его работать?
Шаг 3: Клиент теперь может связаться с сервером
На клиенте:
В браузере я набираю IP-адрес сервера и порт: http://192.168.0.13:12345/status
Теперь я получаю ответ от сервера. Оно работает.
Если я запускаю прокси и перехватываю трафик, то запрос / ответ выглядит так:
запрос
GET /status HTTP/1.1
Host: 192.168.0.13:12345
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (iPad; CPU OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G36 Safari/601.1
Accept-Language: da-dk
Cache-Control: max-age=0
Connection: keep-alive
ответ
HTTP/1.1 200 OK
Server: nginx/1.10.0
Date: Sun, 04 Sep 2016 16:11:39 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
{
"request_index": 1047,
"time": "1473005499"
}