Форум: "Сети";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c