![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Socket-ами и NT4! [D6, Win95/98, NT4]
DmitryPV © (2002-10-09 13:34:00)Добрый день! Я только начинаю работать с TClientCocket и TServerSocket. Разобрал примеры из "Статей". Под Win98 все прекрасно работает, а под NT4 при попытке открыть любой сокет выскакивает ошибка: "Cant create new socket".
В чем могут быть проблемы?
Digitman (2002-10-14 14:40:00) [1]В указаной строчке (где вызывается ф-ция socket(), собственно и создающая гнездо) никаких действий, связанных с понятием "порт" нет - гнездо создается непривязанным ни к какому порту, привязка осуществляется ф-цией bind() (ищи в том же модуле и ставь там еще одну BP).
Так что - быть того не может, чтобы при выполнении строчки с socket() всплыло хоть что-либо напоминающее "port".
Приведи текст строчки исх.текста, адрес которой указан в сообщении об исключении "..ScktSrvr.exe at 00088B6D"
Кстати, а что это за приложение - ScktSrvr.exe ? Это ТВОЕ СОБСТВЕННОЕ приложение, или ты пытаешься "исковеркать" BSS, демо-проект которого ты взял в Делфи и "препарируешь" его непонятным образом ?
DmitryPV (2002-10-14 14:17:00) [2]Результат действительно 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 13:20:00) [3]И при этом любое другое (сторонее) приложение, использующее протокол 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 12:29:00) [4]Совершенно верно! И на D5 и на D6.
Digitman (2002-10-14 12:13:00) [5]Ты хочешь сказать тем самым, что на NT4-машине ошибка одна и та же : 10050 ? Для любого компонента (вне зависимости - клиентский или серверный) и для любого указанного порта ?
DmitryPV (2002-10-14 10:49:00) [6]Приведенный код выдает: Can`t create new socket,WSAErrCode: 10050
В обработчике OnError, как и в примере:
Memo2.Lines.Insert(0, "Error code = "+IntToStr(ErrorCode));
Но естественно, ничего не добавляется, поскольку все отлавливаем в try except в Button1Click.
Digitman (2002-10-14 09:44:00) [7]код некорректен
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 09:21:00) [8]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 08:11:00) [9]>DmitryPV
Нет, ну все, что ты описал - это нормально, так и ожидалось и должно быть).. сервер - 10048 (требуемый порт занят), клиент - 10061 (отказ в обслуживании - нет сервера на интересующем порту)
Ты вот скажи лучше, какой же таки конкретный код (клиента ? сервера ?) приводит на той же самой машине к WSAENETDOWN (10050) ! Вот где нонсеснс-то)..
DmitryPV (2002-10-13 20:25:00) [10]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-13 15:45:00) [11]>>лезет 10061
Кто и куда "лезет" - совершенно непонятно
Ты вообще о чем ? О Клиенте или Сервере ?
Отказ с кодом WSAECONNREFUSED (10061) - это ошибка клиентской стороны, а не серверной. А речь здесь, кажется, изначально идет о серверной стороне
>>у отца вылезает
))))))))))))))))))
да мало ли что у него "вылезает" !
кто твой отец ? сервер ? клиент ? в каком месте кода ты запрашиваешь WSAGetLastError() ?
DmitryPV (2002-10-13 15:18:00) [12]Ситуация такая: под XP до порта с номером 5000 лезет 10061, а под NT4 Workstation+SP6а RUS (у отца на компе) вылезает "Can`t create new socket", а WSAGetLastError() выдает 10050 - хоть ты тресни.
Digitman (2002-10-13 14:56:00) [13]Ну не знаю я, право, откуда у тебя WSANETDOWN взялась) ... это вообще фатальная ошибка считается, а попытка бинда к занятому порту к таковым не относится...
вот, сэмулировал я твою ситуацию только что (W2k)
все четко, как и ожидалось : получаю WSAADDRINUSE = 10048 при попытке бинда к 3050 (он заведомо занят у меня локальным FB-сервером)... и никаких wsanetdown в помине нет...
повтори ситуацию с попыткой бинда к заведомо занятому порту и приведи дословно сообщение об ошибке
DmitryPV (2002-10-13 14:46:00) [14]To Digitman
Бред, не бред, а наконец-то работает. Правда пока под XP - на домашнем компе. Тем не менее, действительно, не совсем ясно.
Digitman (2002-10-13 13:17:00) [15]Бред какой-то...
Попытка занятия уже занятого порта приводит
к 10048 (WSAEADDRINUSE), а не к 10050 (WSANETDOWN)
и никакого отношения к созданию гнезда не имеет - только к привязке.
Откуда взялась WSANETDOWN - совершенно непонятно
DmitryPV (2002-10-13 10:42:00) [16]Господа, проблема решена! Как грится, сам .... В программе использовал порт 1025, как в примерах. На это NT и ругалась. Сменив номер порта я решил проблему.
guest_xxx (2002-10-11 16:28:00) [17]А может быть каким-то местом политки безопасности так настроены админом??? Аське можно никому больше нельзя. Примеры из каталога Demos идут?
Digitman (2002-10-11 15:14:00) [18]Ну так и что теперь ? Так и будешь хныкать ?
А оттрассировать метод ты что, не в состоянии ?
DmitryPV (2002-10-11 15:01:00) [19]To Digitman
Пробовал и под D5 и под D6 на разных компах!
Рядом расположена машина сотрудника под XP. С аськой там - все OK! Утром водрузил на нее D5. Что из этого вышло - см. выше.
Да что за напасть, млин, такая?!!!!!
Digitman (2002-10-11 14:41:00) [20]>DmitryPV
Да нет ! Не достаточно !
С чего ты взял, что "потроха" метода ServerSocket.Open (и всех иных, которые вызываются в его теле) работает одинаково в Д5 и Д6 ? У тебя же Д6, так ? Перестрой то же приложение в Д5 и проверь, если ленишься код компонентов сверить.
А на кой черт ws2_32.dll (если о ней речь) регистрировать в реестре - мне совершенно непонятно. Библиотека явно грузится в модуле scktcomp.pas и никакой регистрации не требуется - была бы она доступна по искомым системой путям.
Еще раз - не парься, запусти любого аськиного клиента на проблемной машине, попытайся выполнить коннект к login.icq.com:5190 и тогда быстро сориентируешься, куда копать дальше