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

Вниз

TCPServer   Найти похожие ветки 

 
anton.   (2004-06-25 14:07) [0]

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


 
Digitman ©   (2004-06-25 14:14) [1]

см. winsock.bind()


 
Rouse_ ©   (2004-06-25 15:39) [2]

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


 
Rouse_ ©   (2004-06-25 15:40) [3]

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


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

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:53) [5]

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


 
Rouse_ ©   (2004-06-25 15:55) [6]

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


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

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


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


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


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


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


 
Rouse_ ©   (2004-06-25 16:19) [9]

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


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

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:28) [11]

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


 
Rouse_ ©   (2004-06-25 16:29) [12]

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

что говорит?


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

все получилось спасибо. Но получается довольно громоздкий код, то есть для того что бы проверить порт я создаю сокет, проверяю, удаляю сокет, затем запускаю 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:47) [14]

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

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

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;


 
Verg ©   (2004-06-25 22:25) [15]

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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.025 c
1-1092039455
Леван
2004-08-09 12:17
2004.08.22
Как емулировать CONDENSED для шрифта


3-1090843450
AleXqwq
2004-07-26 16:04
2004.08.22
ADO+MySql


14-1091557132
AlexG
2004-08-03 22:18
2004.08.22
Для чего нужен маршалинг?


3-1090724957
MSQl
2004-07-25 07:09
2004.08.22
Как выдернуть из БД все записи с определенной датой и числом


1-1092054775
MakNik
2004-08-09 16:32
2004.08.22
Обновление форы