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

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

TCPServer


anton. ©   (2004-06-25 14:07:00) 

Как можно определить занят ли порт, без получения эксепшена?


Verg   (2004-06-25 22:25:00) [1]

Про какой TCPServer идет речь?

TTCPServer никаких "эксепшен"-ов не выдает. Просто не активизируется и все, если порт занят или еще что-то неладится.


Rouse_   (2004-06-25 16:47:00) [2]

Обработчики плохо прописаны...

смотри пример:

function TGSServerSocket.Initialize: Integer;
var
 Err, Opt: Integer;
begin
 Result := SOCKET_ERROR;
 if (csDesigning in ComponentState) then Exit;
 if WSAStartup($202, FWSAData) <> 0 then
 begin
   Error(SysErrorMessage(WSAGetLastError));
   Exit;
 end;
 try
   FServer := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
   if FServer = INVALID_SOCKET then
   begin
     Error(SysErrorMessage(WSAGetLastError));
     Exit;
   end;
   with FSockAddr do
   begin
     sin_addr.S_addr := htonl(INADDR_ANY); // Слушать будем все интерфейсы
     sin_port := htons(FPort);
     sin_family := AF_INET;
   end;
   if bind(FServer, FSockAddr, SizeOf(FSockAddr)) = SOCKET_ERROR then
   begin
     Err := WSAGetLastError;
     if Err <> WSAEADDRINUSE then
     begin
       Error(SysErrorMessage(Err));
       Exit;
     end;
     Opt := 1; // Если адрес используется попробуем всеже сесть на него
     if setsockopt(FServer, SOL_SOCKET, SO_REUSEADDR, @Opt, SizeOf(Opt)) = SOCKET_ERROR then
     begin
       Error(SysErrorMessage(Err));
       Exit;
     end;
     if bind(FServer, FSockAddr, SizeOf(FSockAddr)) = SOCKET_ERROR then
     begin
       Error(SysErrorMessage(Err));
       Exit;
     end;
   end;
   if WSAAsyncSelect(FServer, FHandle, SOCKET_NOTIFY_MSG,
     FD_ACCEPT or FD_READ or FD_WRITE or FD_CLOSE) = SOCKET_ERROR then
   begin
     Error(SysErrorMessage(WSAGetLastError));
     Exit;
   end;
   if listen(FServer, SOMAXCONN) = SOCKET_ERROR then
   begin
     Error(SysErrorMessage(WSAGetLastError));
     Exit;
   end;
   Result := 0;
 except
   if FServer <> INVALID_SOCKET then
     closesocket(FServer);
   WSACleanup;
 end;
end;


anton.   (2004-06-25 16:44:00) [3]

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

if WSAStartup(MAKEWORD(1, 1), WSAData) <> 0 then
  ShowMessage('INVALID_Startup');

 NewSocket:=Socket(AF_INET, SOCK_STREAM, 0);

 if NewSocket = INVALID_SOCKET then
  ShowMessage('INVALID_SOCKET');

 Sock_addr.sin_addr.S_addr := htonl(INADDR_ANY);
 Sock_addr.sin_port := htons(1209);
 Sock_addr.sin_family := AF_INET;

 if bind(NewSocket, Sock_addr, sizeof(Sock_addr))<> SOCKET_ERROR then
  begin
   closesocket(NewSocket);
   PluginHandle:=LoadPackage('C:\vnp\plugins\base\TCPPackage.bpl')
  end;


Rouse_   (2004-06-25 16:29:00) [4]

Err := bind(NewSocket, Sock_addr, sizeof(Sock_addr));
if Err = SOCKET_ERROR then
 ShowMessage(SysErrorMessage(WSAGetLastError));

что говорит?


Rouse_   (2004-06-25 16:28:00) [5]

Удалено модератором
Примечание: Дубль...


anton.   (2004-06-25 16:25:00) [6]

To Digitman ©   (25.06.04 16:12) [8] Да чувствую

To Rouse_ ©   (25.06.04 16:19) [9]
поставил
var
 Sock_addr: sockaddr_in;
все заработало
но WSAGetLastError возвращает код ошибки 9574084 что это за ошибка я пока найти не могу


Rouse_   (2004-06-25 16:19:00) [7]

> Types of actual and formal var parameters must be identical
у тебя в uses что написано? WinSock?


Digitman   (2004-06-25 16:12:00) [8]


> anton.   (25.06.04 14:07)  
> без получения эксепшена?


> bind(NewSocket, @Sock_add, sizeof(Sock_add));
>
> возвращает ошибку WSAENOTSOCK


разницу-то чуешь ? возвратфункцией ошибкии возбуждениенеким оператором исключения?


anton.   (2004-06-25 16:06:00) [9]

if WSAStartup(MAKEWORD(1, 1), WSAData) <> 0 then
  ShowMessage('INVALID_Startup');

 NewSocket:=Socket(AF_INET, SOCK_STREAM, 0);

 if NewSocket = INVALID_SOCKET then
  ShowMessage('INVALID_SOCKET');

 Sock_addr.sin_addr.S_addr := htonl(INADDR_ANY);
 Sock_addr.sin_port := htons(1209);
 Sock_addr.sin_family := AF_INET;
 bind(NewSocket, Sock_addr, sizeof(Sock_addr)); <<-----

 Types of actual and formal var parameters must be identical


Rouse_   (2004-06-25 15:55:00) [10]

bind(NewSocket, Sock_add, sizeof(Sock_add));
есты ты Winsock а не WinSock2 используешь


Rouse_   (2004-06-25 15:53:00) [11]

sin_addr.S_addr := htonl(INADDR_ANY);
     sin_port := htons(FPort);
     sin_family := AF_INET;


anton.   (2004-06-25 15:47:00) [12]

NewSocket:=Socket(AF_INET, SOCK_STREAM, 0);
if NewSocket = INVALID_SOCKET then
ShowMessage('INVALID_SOCKET');

Sock_add.sin_family := PF_INET;
Sock_add.sin_port := 1209;

bind(NewSocket, @Sock_add, sizeof(Sock_add));

возвращает ошибку WSAENOTSOCK
Указанный в параметре дескриптор не является сокетом

Почему?


Rouse_   (2004-06-25 15:40:00) [13]

забыл дописать...
лучше уж winsock.connect (ИМХО)


Rouse_   (2004-06-25 15:39:00) [14]

> [1] Digitman ©   (25.06.04 14:14)
Не обязательно занят...
setsockopt(FServer, SOL_SOCKET, SO_REUSEADDR, @Opt, SizeOf(Opt))


Digitman   (2004-06-25 14:14:00) [15]

см. winsock.bind()


Наверх

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