![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Can t create new socket [D6]
Brand © (2002-07-28 17:29:00)В 2000 винде нет проблем. А попробовал запустить свю прогу в 98-ой и на строчке ClientSocket1.Active:=true вылетает ошибка "Can"t create new socket"
Очеь обидно. В чем может быть дело???
iZEN (2002-08-02 12:45:00) [1]Какие странные детские проблемы ...:)
Digitman (2002-08-01 08:16:00) [2]>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 - вот тебе и причина
Brand (2002-07-31 18:44:00) [3]Рассказываю:
Вот именно в функции ...Open на строчке:
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
возвращается "-1"
И есть у меня TCP/IP
Я ж писал, что стоял там WinGate и может быть он что-то не давал, потому-что после сноса WinGate все заработало без проблем!!!
Malder (2002-07-31 18:10:00) [4]"Возможно порт уже был занят другим приложением" - твоя фраза ?
моя фраза. Но до меня потом дошло, что у человека TClientSocket =) И думаю, у него действительно не стоит TCP/IP протокол. Потому что вроде уж сокет можно создать при любом стечении обстоятельств. Даже если нет соединения и т.д...
Digitman (2002-07-31 08:31:00) [5]>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 00:47:00) [6]А да, кстати. Если у тебя TClientSocket - то бинд тут не при чем. Может правда у тебя протокол TCP/IP не стоит ?
cyborg (2002-07-30 20:35:00) [7]Ну не знаю, я с вами спорить не буду, но когда я пытался запустить одновременно и включить на одном порту два сервера моего чата, то вылетала какая то ошибка, уже не помню чего там говорилось.
Malder (2002-07-30 19:38:00) [8]Digitman, человек использует TClientSocket. Какие нахрен DoOpen(), bind() ? Там это все автоматом же. Может этот компонент пишет, что не может создать сокет, если порт занят. Я не знаю как он там работает...
Digitman (2002-07-30 08:42:00) [9]Не выдумывайте на счет "занятости порта". Не могло быть такого. Потому как создание гнезда и его привязка к порту - две отдельные, совершенно разные операции, выполняемые в контексте DoOpen(). Гнездо создается без указания порта - нет в вызове socket() такого параметра. А bind() действительно может дать отказ при занятом целевом порте, но это же - далеко не create !
Нужно смотреть код возврата socket(), оттрассировав DoOpen() пошагово.
Подозреваю еще, что есть какие-то проблемы в установке/конфигурации протокола TCP/IP в сетевых настройках
cyborg (2002-07-29 18:35:00) [10]>"Can"t create new socket" = "сокет уже занят" ???
Я имел ввиду порт, было у меня такое, когда я пытался повесить сервер на занятый порт.
Malder (2002-07-29 16:55:00) [11]Хм. Вот так. Can"t create new socket - не могу создать новый сокет. А вот почему не может - непонятно. Возможно порт уже был занят другим приложением. Также на линейке win9x нельзя открыть более 255 сокетов. Других причин я не знаю.
Digitman (2002-07-29 12:50:00) [12]>cyborg
"Can"t create new socket" = "сокет уже занят" ???
Это как ?
cyborg (2002-07-29 06:33:00) [13]Просто видимо сокет уже занят был.
Brand (2002-07-29 01:15:00) [14]Еще некоторые подробности:
На том компе стоял WinGate!!!!!
После сноса все заработало. Это конечно хорошо, но хотелось-бы как-то предусмотреть эту ситуацию, и предотвратить вылетание таких критических ошибок.
Brand (2002-07-28 19:19:00) [15]Причем, что интерестно, от винды к винде по-разному. Пробовал на трех разных компах с 98-ой виндой. На двух все нормально, а вот один попался с таким глюком. Может DLL-ки какой-то нехватает???