Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Вниз

Проблема с Socket-ами и NT4!   Найти похожие ветки 

 
DmitryPV   (2002-10-09 13:34) [0]

Добрый день! Я только начинаю работать с TClientCocket и TServerSocket. Разобрал примеры из "Статей". Под Win98 все прекрасно работает, а под NT4 при попытке открыть любой сокет выскакивает ошибка: "Cant create new socket".
В чем могут быть проблемы?


 
Digitman   (2002-10-09 13:55) [1]

TCP-протокол установлен ?


 
DmitryPV   (2002-10-09 14:00) [2]

Да, установлен. Обе машины в локальной сетке под TCP/IP.


 
Digitman   (2002-10-09 14:12) [3]

и что говорит результат вызова WSAGetLastError() в обработчике этого исключения ?


 
DmitryPV   (2002-10-09 14:23) [4]

Не сочти за тупость, но почитав в хелпе про эту ф-цию, не уяснил, как ее правильно вызвать?


 
DmitryPV   (2002-10-09 14:32) [5]

Разобрался. При обработке ексепшена возвращается значение 10050.


 
Digitman   (2002-10-09 15:04) [6]


WSAENETDOWN (10050)
The network subsystem or the associated service provider has failed.


 
DmitryPV   (2002-10-09 15:08) [7]

И как это бороть?


 
Digitman   (2002-10-09 15:31) [8]

для этого нужно знать, как инициализируется Winsock-подсистема (Winsock.WSAStartup) и с какими параметрами вызывается ф-ция Winsock.Socket() в D6. У меня D5 и нет возможности посмотреть соотв. исх. текст в TCustomWinSocket.


 
DmitryPV   (2002-10-09 15:34) [9]

Спасибо и на этом! Попробую на пятерке - может и выйдет.


 
Digitman   (2002-10-09 16:22) [10]

Зачем пробовать ? Просто текст сравни для начала. Касаемый вышеуказанных WSA-ф-ций в модуле scktcomp.pas



 
DmitryPV   (2002-10-11 12:09) [11]

Короче, проблема не решеается никак! Поставил начисто NT4 Server+SP6. Поставил Delphi5. При попытке открыть любой из Socket-ов - те-же грабли!!!! Самое интересное, ей по барабану - установлен TCP или нет, есть сетевуха или нет. Под XP и 2000 - те-же яйца, но в профиль. А компонент NMUDP вообще не желает ложиться на форму - выкидывается : Unknown Error No. 10050.

Под 98 - все Ok. Программа уже вовсю работает.


 
Song   (2002-10-11 13:24) [12]

Однажды уже пробегало такое в форуме. У автора вопроса оказывается не инициализировалась winsock.dll


 
Song   (2002-10-11 13:25) [13]

У меня кстати отлично работают TClientSocket/TServerSocket в NT 4.0


 
DmitryPV   (2002-10-11 13:34) [14]

Прсмотрел я форум! Не нашел :(((. Как правильно проинициализировать? - меня уже начальство досталооо!


 
Song   (2002-10-11 13:58) [15]

Нет, оно должно само. У автора по какой-то причине не работало и он прописывал эту dll-ку в реестре винды самостоятельно.


 
DmitryPV   (2002-10-11 14:20) [16]

Как сие проделать?


 
Song   (2002-10-11 14:22) [17]

Не знаю, у меня такой проблемы не было.


 
Digitman   (2002-10-11 14:22) [18]

Самый простой вариант - запустить на проблемной машине какую-нить стороннюю , заведомо работающую примочку, использующую TCP (ну, например, IPTOOLS) и посмотреть на ее поведение в той же ситуации...

Да что там "примочки" ! Те же ICQ-клиенты разного рода, входящие в коннект через loqin.icq.com, используют TCP. Если проблема та же наблюдается, она глобальна для всех приложений проблемной ОС (или проблемной ее сетевой конфигурации). Иначе - ищи жуков у себя в приложении


 
DmitryPV   (2002-10-11 14:31) [19]

To Digitman
"Иначе - ищи жуков у себя в приложении"

Берем простейшее приложение типа: при нажатии на кнопку - ServerSocket1.Open;
Как и писАл выше - этого уже достаточно!
Проблемные машины? Запускал это дело на семи разных машинах с различной конфигурацией и с осями типа 2000, NT4, XP. Одно и то-же. Скорее всего прийдется както воспользоваться советом Song.



 
Digitman   (2002-10-11 14:41) [20]

>DmitryPV

Да нет ! Не достаточно !
С чего ты взял, что "потроха" метода ServerSocket.Open (и всех иных, которые вызываются в его теле) работает одинаково в Д5 и Д6 ? У тебя же Д6, так ? Перестрой то же приложение в Д5 и проверь, если ленишься код компонентов сверить.

А на кой черт ws2_32.dll (если о ней речь) регистрировать в реестре - мне совершенно непонятно. Библиотека явно грузится в модуле scktcomp.pas и никакой регистрации не требуется - была бы она доступна по искомым системой путям.

Еще раз - не парься, запусти любого аськиного клиента на проблемной машине, попытайся выполнить коннект к login.icq.com:5190 и тогда быстро сориентируешься, куда копать дальше


 
DmitryPV   (2002-10-11 15:01) [21]

To Digitman

Пробовал и под D5 и под D6 на разных компах!
Рядом расположена машина сотрудника под XP. С аськой там - все OK! Утром водрузил на нее D5. Что из этого вышло - см. выше.
Да что за напасть, млин, такая?!!!!!


 
Digitman   (2002-10-11 15:14) [22]

Ну так и что теперь ? Так и будешь хныкать ?
А оттрассировать метод ты что, не в состоянии ?


 
guest_xxx   (2002-10-11 16:28) [23]

А может быть каким-то местом политки безопасности так настроены админом??? Аське можно никому больше нельзя. Примеры из каталога Demos идут?


 
DmitryPV   (2002-10-13 10:42) [24]

Господа, проблема решена! Как грится, сам .... В программе использовал порт 1025, как в примерах. На это NT и ругалась. Сменив номер порта я решил проблему.


 
Digitman   (2002-10-13 13:17) [25]

Бред какой-то...
Попытка занятия уже занятого порта приводит
к 10048 (WSAEADDRINUSE), а не к 10050 (WSANETDOWN)

и никакого отношения к созданию гнезда не имеет - только к привязке.

Откуда взялась WSANETDOWN - совершенно непонятно


 
DmitryPV   (2002-10-13 14:46) [26]

To Digitman
Бред, не бред, а наконец-то работает. Правда пока под XP - на домашнем компе. Тем не менее, действительно, не совсем ясно.


 
Digitman   (2002-10-13 14:56) [27]

Ну не знаю я, право, откуда у тебя WSANETDOWN взялась) ... это вообще фатальная ошибка считается, а попытка бинда к занятому порту к таковым не относится...

вот, сэмулировал я твою ситуацию только что (W2k)

все четко, как и ожидалось : получаю WSAADDRINUSE = 10048 при попытке бинда к 3050 (он заведомо занят у меня локальным FB-сервером)... и никаких wsanetdown в помине нет...

повтори ситуацию с попыткой бинда к заведомо занятому порту и приведи дословно сообщение об ошибке


 
DmitryPV   (2002-10-13 15:18) [28]

Ситуация такая: под XP до порта с номером 5000 лезет 10061, а под NT4 Workstation+SP6а RUS (у отца на компе) вылезает "Can`t create new socket", а WSAGetLastError() выдает 10050 - хоть ты тресни.


 
Digitman   (2002-10-13 15:45) [29]

>>лезет 10061

Кто и куда "лезет" - совершенно непонятно

Ты вообще о чем ? О Клиенте или Сервере ?

Отказ с кодом WSAECONNREFUSED (10061) - это ошибка клиентской стороны, а не серверной. А речь здесь, кажется, изначально идет о серверной стороне


>>у отца вылезает

))))))))))))))))))

да мало ли что у него "вылезает" !
кто твой отец ? сервер ? клиент ? в каком месте кода ты запрашиваешь WSAGetLastError() ?


 
DmitryPV   (2002-10-13 20:25) [30]

To Digitman.
Большое спасибо за науку! Кажется я разобрался в своих ошибках: просто необходимо знать распределение свободных портов.

Сейчас веду разговор про XP.
Кладем на форму:
TServerSocket (ServerSocket1),
TButton (Button1),


Обработчик нажатия на кнопку:

//--------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin

ServerSocket1.Port:=5000;
ServerSocket1.Open;

end;

//-------------------------------------------------------------


При нажатии на кнопку видим сообщение:

Project Project1.exe raised exeption class ESocketError with
message "Windows socket error: Обычно разрешается одно использование
адреса сокета (протокол/сетевой адрес/порт)(10048), on API "bind". Process
stopped. Use Step or Run to continue.

И так до порта 5000 включительно. Начиная с 5001- все Ok!

Про NT посмотрю завтра на работе.

Если то-же проделать с ClientSocket (указав предварительно в данном случае IP=127.0.0.1) без
запущенного приложения с открытым ServerSocket, то естественно поимеем исключение типа 10061.

В начале этой ветки я указал, что только начинаю пробовать силы в приложениях для работы через
сеть. Указал так-же, что разбирал примеры из статей и читал материалы данного раздела форума,
но нигде не нашел и намека на то, что при работе с ОС на ядре NT можно нарваться на подобные
проблемы с портами. Отсюда и пошел весь сюр-бор!


 
Digitman   (2002-10-14 08:11) [31]

>DmitryPV

Нет, ну все, что ты описал - это нормально, так и ожидалось и должно быть).. сервер - 10048 (требуемый порт занят), клиент - 10061 (отказ в обслуживании - нет сервера на интересующем порту)

Ты вот скажи лучше, какой же таки конкретный код (клиента ? сервера ?) приводит на той же самой машине к WSAENETDOWN (10050) ! Вот где нонсеснс-то)..


 
DmitryPV   (2002-10-14 09:21) [32]

To Digitman
Сейчас попробовал на работе.
NT4 Server.
На форме:
-TServerSocket1
-TButton
-TEdit

//---------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var err: integer;
begin

ServerSocket1.Port := 1025;

try
ServerSocket1.Open;
except
err:=WSAGetLastError();
Edit1.Text:=IntToStr(err);
end;

end;
//-------------------------------------------------------

С ЛЮБЫМ номером порта:"Can`t create new socket".
err=10050 !

То-же, если заменить серверный сокет на клиентский.


 
Digitman   (2002-10-14 09:44) [33]

код некорректен

try
ServerSocket1.Open; // или ClientSocket1.Open
except
on e: ESocketError do // !!!!!!!!!!!!
begin
err:=WSAGetLastError();
Edit1.Text:=e.message + " ,WSAErrCode : " + IntToStr(err);
end
else
raise;
end

А где обработка события OnError ?


 
DmitryPV   (2002-10-14 10:49) [34]

Приведенный код выдает: Can`t create new socket,WSAErrCode: 10050

В обработчике OnError, как и в примере:

Memo2.Lines.Insert(0, "Error code = "+IntToStr(ErrorCode));

Но естественно, ничего не добавляется, поскольку все отлавливаем в try except в Button1Click.


 
Digitman   (2002-10-14 12:13) [35]

Ты хочешь сказать тем самым, что на NT4-машине ошибка одна и та же : 10050 ? Для любого компонента (вне зависимости - клиентский или серверный) и для любого указанного порта ?


 
DmitryPV   (2002-10-14 12:29) [36]

Совершенно верно! И на D5 и на D6.


 
Digitman   (2002-10-14 13:20) [37]

И при этом любое другое (сторонее) приложение, использующее протокол TCP (и, соответственно, гнезда в режиме SOCK_STREAM, аналогично режиму гнезд в TClientSocket/TServerSocket), работает нормально ? Тот же ICQ-клиент, скажем ? Или - куда уж проще - Outlook Express ? Или любой другой почтовый smtp/pop3-клиент ?

Чудеса да и только !)))

А ты в состоянии оттрассировать пошагово метод TCustomWinSocket.Open ? Особенно - строчку из scktcomp.pas :

FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);

???

Поймай ее брейкпойнтом, сделай шаг и посмотри WSAGetLastError(), если результатом будет FSocket = INVALID_SOCKET


 
DmitryPV   (2002-10-14 14:17) [38]

Результат действительно FSocket = INVALID_SOCKET.

Я открыл приложение ScktSrvr, поставил прерывание в том модуле и в том месте, где ты сказал.

Ну и дальше пошагово получил: Exeption Exeption in module ScktSrvr.exe at 00088B6D. Error opening port 211 with error: Can`t create new socket.

Если я сделал что-либо не так, тогда укажи, пожалуйста, поточнее, как проделать.



 
Digitman   (2002-10-14 14:40) [39]

В указаной строчке (где вызывается ф-ция socket(), собственно и создающая гнездо) никаких действий, связанных с понятием "порт" нет - гнездо создается непривязанным ни к какому порту, привязка осуществляется ф-цией bind() (ищи в том же модуле и ставь там еще одну BP).

Так что - быть того не может, чтобы при выполнении строчки с socket() всплыло хоть что-либо напоминающее "port".

Приведи текст строчки исх.текста, адрес которой указан в сообщении об исключении "..ScktSrvr.exe at 00088B6D"

Кстати, а что это за приложение - ScktSrvr.exe ? Это ТВОЕ СОБСТВЕННОЕ приложение, или ты пытаешься "исковеркать" BSS, демо-проект которого ты взял в Делфи и "препарируешь" его непонятным образом ?




Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.009 c
4-28371
Nimda
2002-10-25 15:26
2002.12.09
Стандартные диалоги Открыть/Сохранить файл...


1-28010
РоманВитов
2002-11-29 23:06
2002.12.09
матрица


4-28356
Бульбаш
2002-10-28 17:42
2002.12.09
Подскажите плиз в каком модуле RXLib находится функция


1-28101
Начинающий програмер
2002-11-27 16:13
2002.12.09
Интеграция в Винды


14-28273
Dmitriy Polskoy
2002-11-19 09:39
2002.12.09
Логика Reget / FlashGet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский