Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизНарод, помогите, плиз! Сокет глючит! Найти похожие ветки
← →
IDKFA (2002-11-13 15:29) [0]Вообщем так - все хорошо до тех пор, пока я не начинаю коннектиться к сокету, далее:
if (такого не существует) then
прога вместо сообщения и нормального выхода просто зависает
else {если существует}
begin
if (порт=21) then {то есть порт FTP}
все OK(получаем данные)
else
прога просто опять зависает
end;
То есть получается, что нормальная работа только по порту FTP, в остальных случаях прога повисает!!! Подскажите, плиз, чё не так делаю?
Вот код unitа:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WinSock;
type
TForm1 = class(TForm)
EHost: TEdit;
Label1: TLabel;
EPort13: TEdit;
Label2: TLabel;
EPort37: TEdit;
Label3: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
port1 = 13;
port2 = 37;
function RetIP(host2dotted:string):string; {возвращает IP по DNS}
var ConnectionArray:sockaddr_in;
host_struct:PHostEnt;
remote_host:string;
begin
host_struct:=GetHostByName(PChar(host2dotted));
result:="";
remote_host:="";
if (host_struct<>nil) then
begin
with ConnectionArray.Sin_addr, host_struct^ do
begin
S_un_b.s_b1 := h_addr^[0];
S_un_b.s_b2 := h_addr^[1];
S_un_b.s_b3 := h_addr^[2];
S_un_b.s_b4 := h_addr^[3];
remote_host:=IntToStr(Ord(S_un_b.s_b1))+"."+
IntToStr(Ord(S_un_b.s_b2))+"."+
IntToStr(Ord(S_un_b.s_b3))+"."+
IntToStr(Ord(S_un_b.s_b4));
end;
Result:=remote_host;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var wVersionRequested:word;
D:WSAData;
S:TSocket;
A:Sockaddr_in;
Addr:LongInt;
Error:Integer;
Con:Integer;
IPStr,Time:string;
Info:array[1..100] of Char;
begin
wVersionRequested:=makeword(2,0);
Error:=WSAStartup(wVersionRequested,D);
if (Error<>0) then
begin
EHost.Text:="Ошибка в WinSock!";
Exit;
end;
S:=socket(AF_INET, SOCK_STREAM, 0);
if (S=INVALID_SOCKET) then
begin
EHost.Text:="Невозможно создать сокет!";
Exit;
end;
A.sin_family:=AF_INET;
A.sin_port:=htons(21);
Addr:=inet_addr(PChar(EHost.Text));
if(Addr<>INADDR_NONE)then
begin
A.sin_addr.S_addr:=Addr;
end else
begin
IPStr:=RetIP(EHost.Text);
if (IPStr<>"") then
begin
A.sin_addr.S_addr:=inet_addr(PChar(IPStr));
end else
begin
EHost.Text:="Невозможно найти хост!";
end;
end;
Con:=connect(S,A,SizeOf(A));
if (Con=INVALID_SOCKET) then
begin
EHost.Text:="Невозможно подключиться к сокету!";
Exit;
end;
FillMemory(@Info,SizeOf(Info),0);
Con:=recv(S,Info,SizeOf(Info),0);
if (Con=SOCKET_ERROR) then
begin
EHost.Text:="Невозможно считать из сокета!";
Exit;
end else
begin
showmessage(Info);{просто смотрю, чё пришло}
end;
WSACleanUp;
end;
end.
Помогите, плиз, дело горит!!!
← →
Smithson (2002-11-13 15:49) [1]Что значит - прога зависает? Пройди отладчиком и увидишь причину и следствия.
← →
IDKFA (2002-11-13 18:40) [2]
...
Con:=connect(S,A,SizeOf(A)); {Если сокет не существует то здесь виснет}
if (Con=INVALID_SOCKET) then
begin
EHost.Text:="Невозможно подключиться к сокету!";
Exit;
end;
FillMemory(@Info,SizeOf(Info),0);
Con:=recv(S,Info,SizeOf(Info),0);{Если сокет существует, но не 21, то здесь виснет}
if (Con=SOCKET_ERROR) then
begin
EHost.Text:="Невозможно считать из сокета!";
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c