Проблема в том, что следующий код работает хорошо, если IPAddress.Any
был задан в качестве параметра, но выдает ошибку, если используется `IPAddress.IPv6Any.
Я получаю сообщение об ошибке # 10057
Сокет не подключен.
Запрос на отправку или получение данных был отклонен, поскольку сокет не подключен и (при отправкена сокете датаграмм с использованием sendto) адрес не был указан.Любой другой тип операции может также вернуть эту ошибку - например, настройка setsockopt SO_KEEPALIVE, если соединение было сброшено.
Почему он не работает как IPv6Any?Я почти уверен, что это не брандмауэр, так как порт остается тем же, и он работает с IPv4 (и мой брандмауэр должен пропускать любые запросы, сделанные моим приложением).
Чтобы сократить код, это что-то вродеэто:
Слушатель:
listener = new TcpListener(IPAddress.IPv6Any, portNr);
listener.AllowNatTraversal(true);
listener.Start();
listener.BeginAcceptTcpClient(this.AcceptClient, null);
Клиент:
client = new TcpClient();
client.NoDelay = true;
try
{
this.client.Connect(ip, port); //ip = "localhost" when connecting as server
}
catch (Exception ex)
{
FileLogger.LogMessage(ex);
Disconnect();
}
Я пытаюсь настроить «серверную» часть TCP-соединения.
Что я делаю, так это то, что я запускаю прослушиватель на локальном хосте, а затем подключаюсь к нему в качестве клиента (и разрешаю другим присоединяться в качестве клиентов).
То, что я пытаюсьдобиться этого можно с помощью прямой адресации этого TCP-сервера, следуя этой статье: http://blogs.msdn.com/b/ncl/archive/2009/07/27/end-to-end-connectivity-with-nat-traversal-.aspx
Причина, по которой я это делаю, заключается в том, что я хочу, чтобы человек A мог подключаться к человеку Bкогда они оба находятся за маршрутизаторами NAT.