Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.09;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.023 c
1-28110
Mity
2002-11-27 14:21
2002.12.09
Нужен компонент


3-27879
Arkady
2002-11-21 13:17
2002.12.09
DBGrid


14-28279
Cr@sh
2002-11-19 14:21
2002.12.09
Подскажите с чего начать...


3-27823
Veronika
2002-11-20 13:45
2002.12.09
Временные таблицы в IB


14-28270
Bboy tn
2002-11-12 19:50
2002.12.09
Продукция компании GigaByte