Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с Socket-ами и NT4! [D6, Win95/98, NT4]


Страницы:   1 2

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 и тогда быстро сориентируешься, куда копать дальше


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо