Добрый день!
Не удаётся создать 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)"}
Здравствуйте, Artjom, Вы писали:
Попробуйте сделать как написано
здесь
[offtop]
Здравствуйте, Artjom, Вы писали:
A>Код:
catch (System.Exception ex) {
}
Вы же знаете, что так делать сильно не рекомендуется? просто для примера привели, да?
[/offtop]
Здравствуйте, 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. Если вы хотите получить ответ, то разумнее потрать немного времени на формирование вопроса, на который удобно отвечать. Это сэкономит время отвечающему и, соответственно, увеличит вероятность ответа
Здравствуйте, Neco, Вы писали:
N>[offtop]
N>Здравствуйте, Artjom, Вы писали:
A>>Код:
N>N> catch (System.Exception ex) {
N> }
N>
N>Вы же знаете, что так делать сильно не рекомендуется? просто для примера привели, да?
N>[/offtop]
Нет, не знаю.
Даже не понимаю, что именно не так.
А как надо?
Здравствуйте, 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 и его настройках(или файлах), Что там нужно исправить и как?
Здравствуйте, 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">
Удачи, Сергей.