Check if FTP server isn't offline, my prog allways saying it is online
Code:
ftp::ftp() {
Connected = 0;
hListenSocket = INVALID_SOCKET;
hControlSocket = INVALID_SOCKET;
hDataSocket = INVALID_SOCKET;
bSendPort = 1;
ReadCommand = 0;
bMode=ASCII;
InitWinsock();
};
ftp::~ftp() {
};
void ftp::DoOpen( char *command)
{
char *szHost=NULL; /* remote host */
/*
* do not do anything if we are already connected.
*/
if( Connected ) {
//printf("Already connected. Close connection first.\n");
fflush(stdout);
return;
}
/*
* extract the remote host from command line (if given ).
* make a copy of the host name with strdup.
*/
if(!strcmp(command,"open") || !strcmp(command,"o")) {
//printf("Host:"); fgets(szBuffer,1024,stdin);
(void)strtok(szBuffer,"\n");
szHost = (char *)strdup(szBuffer);;
}
else if( !strncmp(command,"open ",5))
szHost = strdup(&command[5]);
else if( !strncmp(command,"o ",2) )
szHost = strdup(&command[2]);
else
szHost = strdup(command);
//printf("Connecting to %s\n",szHost);
hControlSocket = ConnectToServer(szHost,"21");
#if (defined(WIN32) || defined(_WIN32) )
Sleep(1);
#else
sleep(1);
#endif
if( hControlSocket > 0) {
//printf("Connected to %s\n",szHost);
/*#if (defined(WIN32) || defined(_WIN32) )
sprintf(command,"dftp: Connected to %s ", szHost);
SetConsoleTitle(command); // set console window title
#endif*/
Connected = 1; /* we ar now connected */
CNC=true;
GetReply(); /* get reply (welcome message) from server */
//DoLogin((char *)NULL); /* prompt for username and password */
//DoBinary(); /* default binary mode */
}
free(szHost); /* free the strdupped string */
}
int ftp::ConnectToServer(char *name, char *port)
{
int s;
unsigned int portnum;
struct sockaddr_in server;
struct hostent *hp;
while( name && *name == ' ') name++;
if( !name || ! (*name) )
return INVALID_SOCKET;
portnum = atoi(port);
bzero((char *) &server, sizeof(server));
if( isdigit(name[0])) {
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(name);
server.sin_port = htons(portnum);
}
else{
if ( (hp = gethostbyname(name)) == NULL)
{
#if (!defined( _WIN32 ) || !defined( WIN32 ))
perror("gethostbyname");
#else
//printf("gethostbyname: error code: %d\r\n", WSAGetLastError());
#endif
return INVALID_SOCKET;
}
bcopy(hp->h_addr,(char *) &server.sin_addr,hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(portnum);
}/* else */
/* create socket */
if( (s = socket(AF_INET, SOCK_STREAM, 0)) < 1) {
#if (!defined( _WIN32 ) || !defined( WIN32 ))
perror("socket");
#else
//printf("socket: error code: %d\r\n", WSAGetLastError());
#endif
return INVALID_SOCKET;
}
if (connect(s,(struct sockaddr *)&server, sizeof(server))< 0) {
#if (!defined( _WIN32 ) || !defined( WIN32 ))
perror("connect");
#else
//printf("connect: error code: %d\r\n", WSAGetLastError());
#endif
return INVALID_SOCKET;
}
setsockopt(s,SOL_SOCKET,SO_LINGER,0,0);
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,0,0);
setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,0,0);
hDataSocket = s;
return s;
}
when i do DoOpen() it shows allways Connected == 1, and CNC == true ... where is the mistake?
Re: Check if FTP server isn't offline, my prog allways saying it is online
how is INVALID_SOCKET defined? Your ConnectToServer() method returns it on errors, but you check if the result is >0.
Re: Check if FTP server isn't offline, my prog allways saying it is online
i changed all return INVALID_SOCKET; to return NULL; but nothing changed
Re: Check if FTP server isn't offline, my prog allways saying it is online
then run through the code with the debugger and see where it fails. Should be fairly easy.
Re: Check if FTP server isn't offline, my prog allways saying it is online
Code:
setsockopt(s,SOL_SOCKET,SO_LINGER,0,0);
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,0,0);
setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,0,0);
hDataSocket = s;
return s;
this part of code is wrong, s is a random number not depending if connection successefull or not =\ i think i need a new way to detect if FTP online or offline, any suggestions?
Re: Check if FTP server isn't offline, my prog allways saying it is online
the setsockopt part cannot be wrong, the failure must be before. s can be anything, so don't assume it has to have a specific value.
socket() returns -1 on failure, so you should check for that (also I admit that 0 does not look like a valid socket ;-)).
IMO, trying to connect() to your server is the only chance to see if it is up (or at least if you can reach it from your network).
Try to create a minimum example that compiles and reproduces the failure, and we can check. The code fragments you posted are not enough.
HTH,
Richard
Re: Check if FTP server isn't offline, my prog allways saying it is online
after hDataSocket = s; i did a display "%d",hDataSocket, if server was up it was 1960, 1900, 1768, if server was offline it was 1940 or 1876 or some other, 0isn't a valid socket but check is checking if value more than 0, 0 is not so it should be set to offline status if we got 0, i'm writing a dynamic library, not a win32 program, so posting something full may be a problem.
and i thought that code has
Code:
if( (s = socket(AF_INET, SOCK_STREAM, 0)) < 1) {
check with return NULL; if condition is met, but it's not ... maybe you could post a few lines of code to check ftp server status with socket() ?
Re: Check if FTP server isn't offline, my prog allways saying it is online
as I said, s can be any value. It is just the socket on your client side, it has nothing to do with the availability of your server. The values you name all look like valid sockets to me, so where's the problem? Are you sure your server is down on some attempts?
If connect() succeeds that means a connection has been established.
Hey, and unless you do not post a fully compilable and running code, I won't either ;-)
No offense,
Richard
Re: Check if FTP server isn't offline, my prog allways saying it is online
i'm sure server is offline, i turn it off before i check it)
may that server and client of ftp is the same machine be the problem btw? O_o or that there are other network services running?
..
Re: Check if FTP server isn't offline, my prog allways saying it is online
now i think it does matter, i tried to connect to non valid address and instead of giveing me back random number for 's' it just froze the application, but that's not a variant also =\
Re: Check if FTP server isn't offline, my prog allways saying it is online
you need to understand the nature of a socket. You create it locally in the first step, that gives you your local socket. The value might be within an area of 19something, as you already saw.
Then you try to connect() to a remote address. If your PC can resolve the remote address, a connection attempt is made. If there is someone at the remote address (listening on the port you specify), then the attempt will succeed and connect() will return without an error. Otherwise, you'll encounter an error.
If you are doing your test with client and server on the same machine, maybe you are mixing up with a service already running on it? Try using your client with a port other than 21, use an arbitrary port.
Or checkout http://technet.microsoft.com/en-us/s.../bb897437.aspx for TcpView, a great tool.
I didn't check your code yet, will do later.
OTK,
Richard
Re: Check if FTP server isn't offline, my prog allways saying it is online
i tried to connect to port 22 not 21 into my FTP (on my machine) and it returned NULL and didn't freeze
then i tried to connect to port 21 with FTP server turned off and it returned 1872 socket
then i made FTP server listen on 22 port and tried to connect to it while it is offline, got NULL
wonder what responds on 21 port if not my FTP ? =\ *(oh looks like my proxy server, thx for that program)
now problem is application freezes if can't access IP ( i tried non existing IP to connect, think my IP will act the same if i go offline)
Re: Check if FTP server isn't offline, my prog allways saying it is online
you'll have to wait long enough, DNS resolution may take minutes ...
But you are on the right track ;-)
Re: Check if FTP server isn't offline, my prog allways saying it is online
i don't want minutes =\ and me and anyone else will think program just not responding, is it possible to limit resolution time or something?
Re: Check if FTP server isn't offline, my prog allways saying it is online
i thought problem might be in gethostbyname.... but i have
Code:
if( isdigit(name[0])) {
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(name);
server.sin_port = htons(portnum);
}
check =\