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

Вниз

Can t create new socket   Найти похожие ветки 

 
Brand   (2002-07-28 17:29) [0]

В 2000 винде нет проблем. А попробовал запустить свю прогу в 98-ой и на строчке ClientSocket1.Active:=true вылетает ошибка "Can"t create new socket"
Очеь обидно. В чем может быть дело???


 
Brand   (2002-07-28 19:19) [1]

Причем, что интерестно, от винды к винде по-разному. Пробовал на трех разных компах с 98-ой виндой. На двух все нормально, а вот один попался с таким глюком. Может DLL-ки какой-то нехватает???


 
Brand   (2002-07-29 01:15) [2]

Еще некоторые подробности:
На том компе стоял WinGate!!!!!
После сноса все заработало. Это конечно хорошо, но хотелось-бы как-то предусмотреть эту ситуацию, и предотвратить вылетание таких критических ошибок.


 
cyborg ©   (2002-07-29 06:33) [3]

Просто видимо сокет уже занят был.


 
Digitman ©   (2002-07-29 12:50) [4]

>cyborg
"Can"t create new socket" = "сокет уже занят" ???

Это как ?


 
Malder ©   (2002-07-29 16:55) [5]

Хм. Вот так. Can"t create new socket - не могу создать новый сокет. А вот почему не может - непонятно. Возможно порт уже был занят другим приложением. Также на линейке win9x нельзя открыть более 255 сокетов. Других причин я не знаю.


 
cyborg ©   (2002-07-29 18:35) [6]

>"Can"t create new socket" = "сокет уже занят" ???
Я имел ввиду порт, было у меня такое, когда я пытался повесить сервер на занятый порт.


 
Digitman ©   (2002-07-30 08:42) [7]

Не выдумывайте на счет "занятости порта". Не могло быть такого. Потому как создание гнезда и его привязка к порту - две отдельные, совершенно разные операции, выполняемые в контексте DoOpen(). Гнездо создается без указания порта - нет в вызове socket() такого параметра. А bind() действительно может дать отказ при занятом целевом порте, но это же - далеко не create !

Нужно смотреть код возврата socket(), оттрассировав DoOpen() пошагово.

Подозреваю еще, что есть какие-то проблемы в установке/конфигурации протокола TCP/IP в сетевых настройках


 
Malder ©   (2002-07-30 19:38) [8]

Digitman, человек использует TClientSocket. Какие нахрен DoOpen(), bind() ? Там это все автоматом же. Может этот компонент пишет, что не может создать сокет, если порт занят. Я не знаю как он там работает...


 
cyborg ©   (2002-07-30 20:35) [9]

Ну не знаю, я с вами спорить не буду, но когда я пытался запустить одновременно и включить на одном порту два сервера моего чата, то вылетала какая то ошибка, уже не помню чего там говорилось.


 
Malder ©   (2002-07-31 00:47) [10]

А да, кстати. Если у тебя TClientSocket - то бинд тут не при чем. Может правда у тебя протокол TCP/IP не стоит ?


 
Digitman ©   (2002-07-31 08:31) [11]

>Malder

Bind() в контексте TClientSocket действительно ни при чем.
>>"Возможно порт уже был занят другим приложением" - твоя фраза ?Так вот только bind() может дать отказ по этой причине, поскольку именно в нем происходит попытка занятия порта. А он никогда не выполняется в контексте клиента, только - сервера. Т.е. эта причина исключена на все 100%.
Вот конкретное место в коде клиента, где возникает исключение :


procedure TCustomWinSocket.Open(const Name, Address, Service: string; Port: Word; Block: Boolean);
begin
if FConnected then raise ESocketError.CreateRes(@sSocketAlreadyOpen);
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
if FSocket = INVALID_SOCKET then raise ESocketError.CreateRes(@s CannotCreateSocket);
try
Event(Self, seLookUp);
if Block then
begin
FAddr := InitSocket(Name, Address, Service, Port, True);
DoOpen; // здесь - вызов connect()
end else
AsyncInitSocket(Name, Address, Service, Port, 0, True);
except
Disconnect(FSocket);
raise;
end;
end;


Т.о., для установления причины отказа достаточно проконтролировать в отладчике значение WSAGetLastError() после неуспешного выполнения socket(). К сожалению, Борланд не счел нужным возбуждать исключение с точной диагностикой отказа. Но ради установления причины проделать однократно это вполне можно и нужно.


 
Malder ©   (2002-07-31 18:10) [12]

"Возможно порт уже был занят другим приложением" - твоя фраза ?

моя фраза. Но до меня потом дошло, что у человека TClientSocket =) И думаю, у него действительно не стоит TCP/IP протокол. Потому что вроде уж сокет можно создать при любом стечении обстоятельств. Даже если нет соединения и т.д...


 
Brand   (2002-07-31 18:44) [13]

Рассказываю:
Вот именно в функции ...Open на строчке:
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
возвращается "-1"
И есть у меня TCP/IP
Я ж писал, что стоял там WinGate и может быть он что-то не давал, потому-что после сноса WinGate все заработало без проблем!!!


 
Digitman ©   (2002-08-01 08:16) [14]

>Brand

Повторяю :

Return Values

If no error occurs, socket returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Что тут непонятного ? Получил -1, тут же запросил WSAGetLastError - вот тебе и причина


 
iZEN   (2002-08-02 12:45) [15]

Какие странные детские проблемы ...:)



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

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
1-8049
Карлсон
2002-09-22 15:05
2002.10.03
преобразование времени.


3-7802
firedemon
2002-09-10 13:35
2002.10.03
Как ускорить запросы SQL проводимые над Paradox базой?


7-8179
Юра
2002-07-04 23:34
2002.10.03
SoundCard


6-8089
Yuriy
2002-08-01 08:25
2002.10.03
Помогите разобраться с web компанентами.


1-7894
Alibaba
2002-09-23 11:05
2002.10.03
MessageDlg