Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Клиент отваливается по таймауту -- C#

38K
02 июля 2008 года
Nameless One
6 / / 02.07.2008
Доброго времени суток всем!
Возникла следующая проблема: есть многопользовательский сервер (с мультиплексированием), написан на C#. Пока тестил все на одной машине - все было отлично. Как только запустил сервер с клиентом на разных машинах - клиент отваливается по таймауту. Связь есть гарантированно.
Ниже привожу фрагменты кода, ибо у меня сильное подозрение, что я что-то не так делаю с bind'ом...

Код:
private void SetupServerSocket()
        {
            // Получаем информацию о локальном компьютере
            IPHostEntry localMachineInfo =
                Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint myEndpoint = new IPEndPoint(
               localMachineInfo.AddressList[0], _port);

            // Создаем сокет, привязываем его к адресу
            // и начинаем прослушивание
            _serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            _serverSocket.Bind(myEndpoint);
            _serverSocket.Listen((int)SocketOptionName.MaxConnections);
        }
        private void ProcessSockets()
        {
            byte[] buffer = new byte[512];
            List<Socket> readSockets = new List<Socket>();
            List<Socket> connectedSockets = new List<Socket>();
            List<Socket> authSockets = new List<Socket>();
            try
            {
                SetupServerSocket();
                while (true)
                {
                    // Заполняем список сокетов чтения
                    readSockets.Clear();
                    readSockets.Add(_serverSocket);
                    readSockets.AddRange(connectedSockets);
                    // Определяем статус сокетов
                    Socket.Select(readSockets, null, null, int.MaxValue);


З.Ы. В C# я новичок, так что сорри если мой вопрос из серии RTFM =)
5
02 июля 2008 года
hardcase
4.5K / / 09.08.2005
Забейте на сокеты и пользуйтесь TcpListener и TcpClient/NetworkStream.
Это в любом случае проще и безопаснее того, что вы написали.
38K
02 июля 2008 года
Nameless One
6 / / 02.07.2008
Спасибо за оперативный ответ! =)
Ну, что касается TcpListener - попробую так, посмотрим, что выйдет...
И все же, хотя бы даже ради спортивного интереса, нет ли каких либо мыслей по поводу того, из-за чего такая ерунда происходит?
Кстати, что интересно: когда я коннектился с локальной машины - я вбивал даж не localhost, а ее сетевое имя - и все было нормально...
14
02 июля 2008 года
Phodopus
3.3K / / 19.06.2008
а что в localMachineInfo.AddressList[0]?

может ты биндишься на loopback-интерфейс?

Цитата:
когда я коннектился с локальной машины - я вбивал даж не localhost, а ее сетевое имя - и все было нормально...



умная виндоза должна разгадать такую "хитрость" и все-равно работать через петлю

38K
02 июля 2008 года
Nameless One
6 / / 02.07.2008
Я смотрел в дебагере - там ровно то, что надо =)
На самом деле это было первое о чем я подумал, но к сожалению...
14
02 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Файерволл?
33K
02 июля 2008 года
shilen
7 / / 16.11.2007
Было б интересно увидеть строчку из "netstat -a -n" на сервере, где про то как слушается порт задачи. Если там не 0.0.0.0 (или реальный адресс доступный с другой машины), а 127.0.0.1, то очень теоретически можно добится таймаута и копать нужно в сторону Bind. Если же там 0.0.0.0 (или реальный адресс доступный с другой машины), то убить файрволл (брендмауер) по маршруту однозначно :)

Кстати из чего такая уверенность : "Связь есть гарантированно" ?
38K
02 июля 2008 года
Nameless One
6 / / 02.07.2008
netstat'ом там виден собственно адрес машины, файервола там отродясь не стояло =)
уверенность у меня из следующего: пинг есть, по другим открытым портам все прозванивается telnet'ом (кстати по нужному порту telnet так же отваливается по таймауту =))... Или я тут чего-то не понимаю?
Кстати, а с семейством адресации у меня все в порядке?..
В принципе я в сторону bind'а и копаю, но чессно гря уже поддостало малец, тем более, что в варианте на одной машине все отлично работало и я ужо думал прогу сдавать... =)
14
03 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: Nameless One
кстати по нужному порту telnet так же отваливается по таймауту...



естественно, только когда прога запущена?

Цитата: Nameless One
Кстати, а с семейством адресации у меня все в порядке?..



Скорей всего.. InterNetwork там должно быть

А сервер из Listen/Accept то выходит? (или это асинхронные сокеты?)

и кстати, где сам Accept-то?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог