Проблема с открытием UDP-сокетом
От: Artjom  
Дата: 14.11.11 14:48
Оценка:
Добрый день!
Не удаётся создать UDP-сокет.
Код:
        public TUDPServer(ushort server_port, int fifo_size) {
            FiFONext=FiFOFirst=0;
            FIFOSize=fifo_size;
            FIFO=new TUDPPacket[FIFOSize];
            Port=server_port;
            Finish=false;
            SocketState=0;
            try {
                InitSocket();
            }
            catch (System.Exception ex) {
                
            }
        }
        void InitSocket() {
            try {
                mysocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                SocketState=1;
            }
            catch (System.Net.Sockets.SocketException) {
            }
        }


Возникает исключение на строчке mysocket = new Socket
Текст исключения:
((System.Configuration.ConfigurationErrorsException)(ex))
InnerException = {"Unrecognized configuration section system.serviceModel. (C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\Config\\machine.config line 145)"}

Re: Проблема с открытием UDP-сокетом
От: anomander  
Дата: 14.11.11 15:01
Оценка:
Здравствуйте, Artjom, Вы писали:
Попробуйте сделать как написано здесь
Re: Проблема с открытием UDP-сокетом
От: Neco  
Дата: 14.11.11 21:14
Оценка:
[offtop]
Здравствуйте, Artjom, Вы писали:

A>Код:

            catch (System.Exception ex) {
                
            }


Вы же знаете, что так делать сильно не рекомендуется? просто для примера привели, да?
[/offtop]
всю ночь не ем, весь день не сплю — устаю
Re: Проблема с открытием UDP-сокетом
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 15.11.11 09:05
Оценка:
Здравствуйте, Artjom, Вы писали:

A>Возникает исключение на строчке mysocket = new Socket

A>Текст исключения:
A>
A>((System.Configuration.ConfigurationErrorsException)(ex))
A>InnerException = {"Unrecognized configuration section system.serviceModel. (C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\Config\\machine.config line 145)"}
A>

A>

Так там же красным по английскому напиасано, в чем проблема У вас чего-то не то в вашем конфиге. Скопируйте свой же код в пустое консольное приложение и запустите и будет все ок (я, например, так и сделал и никаких ошибок не возникло).

К коду есть МНОГО вопросов (если это не лаба, для лабы код походит, для других целей — нет).
1. Наименование ужасно. В .NET-е существуют устойчивые правила именования классов, полей, параметров и т.д.
Классы: PamelCase — в вашем случае: UdpServer (никаких префиксов, исключения — только имена интерфейсов, которые начинаются с I, например, IDisposable).

Поля: camelCase — в вашем случае поля должны быть: fifoNext, fifoSize и т.д., возможно использование лидирующего подчеркивания (т.е. _fifoNext)

Параметры: так же как и поля. Формат типа server_port — не принят.

2. Обработка исключений
В вашем коде блоки catch вообще пустые (как правильно уже заметили), что усложняет вашу отладку, да и каждому читателю для проверки туда хоть что-то придется вбить.

3. Дизайн. Судя по количеству кода, ваш класс TUDPServer нужно переименовать на UDPШвейцарскийНожServer, настолько много всего он делает. Такими темпами в нем понять вообще ничего нельзя будет очень и очень скоро.

4. Формат заданного вопроса.
Чтобы проверить работоспособность вашего кода нужно было сделать ряд дополнительных действий, таких как объявление класса, вынос полей, добавление вывода в консоль в блоках catch. Если вы хотите получить ответ, то разумнее потрать немного времени на формирование вопроса, на который удобно отвечать. Это сэкономит время отвечающему и, соответственно, увеличит вероятность ответа
Re[2]: Проблема с открытием UDP-сокетом
От: Artjom  
Дата: 15.11.11 10:20
Оценка:
Здравствуйте, Neco, Вы писали:

N>[offtop]

N>Здравствуйте, Artjom, Вы писали:

A>>Код:

N>
N>            catch (System.Exception ex) {
                
N>            }
N>


N>Вы же знаете, что так делать сильно не рекомендуется? просто для примера привели, да?

N>[/offtop]


Нет, не знаю.
Даже не понимаю, что именно не так.
А как надо?
Re[2]: Проблема с открытием UDP-сокетом
От: Artjom  
Дата: 15.11.11 16:08
Оценка:
Здравствуйте, SergeyT., Вы писали:

ST>Здравствуйте, Artjom, Вы писали:


A>>Возникает исключение на строчке mysocket = new Socket

A>>Текст исключения:
A>>
A>>((System.Configuration.ConfigurationErrorsException)(ex))
A>>InnerException = {"Unrecognized configuration section system.serviceModel. (C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\Config\\machine.config line 145)"}
A>>

A>>

ST>Так там же красным по английскому напиасано, в чем проблема У вас чего-то не то в вашем конфиге.


Где проблема понятно. Непонятно как исправить
Вот содержимое файла со строки 145:
    <system.serviceModel>
        <client>
            <metadata>
                <policyImporters>
                    <extension type="System.serviceModel.Channels.ContextBindingElementImporter, system.workflowservices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
                    <extension type="System.serviceModel.Channels.ContextBindingElementImporter, system.workflowservices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
                </policyImporters>
                <wsdlImporters>
                    <extension type="System.serviceModel.Channels.ContextBindingElementImporter, system.workflowservices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
                    <extension type="System.serviceModel.Channels.ContextBindingElementImporter, system.workflowservices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
                </wsdlImporters>
            </metadata>
        </client>
        <extensions>
            <behaviorExtensions>
                <add name="persistenceProvider" type="System.serviceModel.Configuration.PersistenceProviderElement, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="workflowRuntime" type="System.serviceModel.Configuration.WorkflowRuntimeElement, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="enableWebScript" type="System.serviceModel.Configuration.WebScriptEnablingElement, System.serviceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="webHttp" type="System.serviceModel.Configuration.WebHttpElement, System.serviceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </behaviorExtensions>
            <bindingElementExtensions>
                <add name="webMessageEncoding" type="System.serviceModel.Configuration.WebMessageEncodingElement, System.serviceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="context" type="System.serviceModel.Configuration.ContextBindingElementExtensionElement, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </bindingElementExtensions>
            <bindingExtensions>
                <add name="wsHttpContextBinding" type="System.serviceModel.Configuration.WSHttpContextBindingCollectionElement, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="netTcpContextBinding" type="System.serviceModel.Configuration.NetTcpContextBindingCollectionElement, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="webHttpBinding" type="System.serviceModel.Configuration.WebHttpBindingCollectionElement, System.serviceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add name="basicHttpContextBinding" type="System.serviceModel.Configuration.BasicHttpContextBindingCollectionElement, System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </bindingExtensions>
        </extensions>
    </system.serviceModel>


ST>Скопируйте свой же код в пустое консольное приложение и запустите и будет все ок (я, например, так и сделал и никаких ошибок не возникло).

Код рабочий и программа работала до тех пор пока не была установлена .NET версии 4.0.

ST>К коду есть МНОГО вопросов (если это не лаба, для лабы код походит, для других целей — нет).

ST>1. Наименование ужасно. В .NET-е существуют устойчивые правила именования классов, полей, параметров и т.д.
ST> Классы: PamelCase — в вашем случае: UdpServer (никаких префиксов, исключения — только имена интерфейсов, которые начинаются с I, например, IDisposable).


ST> Поля: camelCase — в вашем случае поля должны быть: fifoNext, fifoSize и т.д., возможно использование лидирующего подчеркивания (т.е. _fifoNext)


ST> Параметры: так же как и поля. Формат типа server_port — не принят.


Delphi даёт о себе знать. Не так просто переменить ставший привычным стиль написния/именования и проч.

ST>2. Обработка исключений

ST> В вашем коде блоки catch вообще пустые (как правильно уже заметили), что усложняет вашу отладку, да и каждому читателю для проверки туда хоть что-то придется вбить.

Там делать нечего, потому и пустые блоки catch: если connect проиэошёл — хорошо, нет — пытаемся до успеха.

ST>3. Дизайн. Судя по количеству кода, ваш класс TUDPServer нужно переименовать на UDPШвейцарскийНожServer, настолько много всего он делает. Такими темпами в нем понять вообще ничего нельзя будет очень и очень скоро.


Всего лишь подключается к порту и слушает его.
Вобщем не понял претензии.
Как бы Вы сделали?

ST>4. Формат заданного вопроса.

ST> Чтобы проверить работоспособность вашего кода нужно было сделать ряд дополнительных действий, таких как объявление класса, вынос полей, добавление вывода в консоль в блоках catch. Если вы хотите получить ответ, то разумнее потрать немного времени на формирование вопроса, на который удобно отвечать. Это сэкономит время отвечающему и, соответственно, увеличит вероятность ответа

Дело не в коде, а в NET и его настройках(или файлах), Что там нужно исправить и как?
Re[3]: Проблема с открытием UDP-сокетом
От: SergeOnNest  
Дата: 18.11.11 07:10
Оценка:
Здравствуйте, Artjom, Вы писали:

A>Где проблема понятно. Непонятно как исправить

A>Вот содержимое файла со строки 145:

И в строке 145 система наткнулась на неожиданную и непонятную для нее секцию system.serviceModel.
Проверь, есть ли выше заголовок этой секции?
В <configSections> должна быть строчка вида (у меня она выглядит так):
<sectionGroup name="system.serviceModel" 
type="System.ServiceModel.Configuration.ServiceModelSectionGroup, System.ServiceModel, 
Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">


Удачи, Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.