Форум: "Сети";
Текущий архив: 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