Форум: "Сети";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c