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

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

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-ки какой-то нехватает???


Наверх

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