![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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()