Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Creating an FTP Client

2 views
Skip to first unread message

Vinicio Flores

unread,
Jul 3, 2011, 11:07:17 PM7/3/11
to
Can you tell me what I have to know if I want to write a FTP Client??
And can you tell me how can I do it??

And if you have a good UNIX sockets howto to give, please give me one!!!!

I am working under GNU/Linux , I want to implement it using Sockets
Thank you!!!

Vinicio Flores

unread,
Jul 4, 2011, 12:44:57 AM7/4/11
to

Here I put the files:

/** MAIN FILE -- cnet.c **/

/*
* A simple client to open connection
* to servers and comunicate with
* them.
*/

#ifndef _CNET_H
#include "cnet.h"
#endif

int main(argc, argv)
int argc;
char **argv;
{
// If the user no input the needed
// arguments
if(argc != 3)
handle_err(NEED_ARGC);

// The struct where I will
// save the socket
// connection data
struct sock_client *sock = malloc ( sizeof(struct sock_client));
// The client address struct
struct sockaddr_in serv_addr;
// Information about the server
struct hostent *server;

// The read and write streams
// to FTP server
FILE *cout, *cin;

Buffer cbuff;

// The message that
// I will send
String sended = "Hello World, I am connected to this server\n\r";

// Convert the third argument
// to an integer number to
// get the port number
sock->n_port = atoi( *(argv + 2) );

// Creates socket
sock->sockfd = socket(AF_INET, SOCK_STREAM, 0);

// Check if the creation of socket fails or is done...
if(sock->sockfd == SYS_ERR)
handle_err(OPENSOCK_ERR);

// Initializes structs to zero
memset(&serv_addr, 0, sizeof(serv_addr));

// Get the host by its name
server = gethostbyname( *(argv + 1) );

// If cannot resolve host ...
if(!server) // You can do a server ==
NULL but is more beauty to use !server and the GCC won't cry
handle_err(GETHOST_ERR);

// Fill the server address struct
serv_addr.sin_addr = *((struct in_addr *)server->h_addr );
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(sock->n_port);

// The server address length
sock->addrlen = sizeof(serv_addr);

// Get the remote ip address
sock->ip = inet_ntoa(serv_addr.sin_addr);

// Print the IP Address
setcolor(FOREBLUE);
cprintf("IP Address: ");

setattr(BOLD);
setcolor(FOREGREEN);

cprintf("%s\033[0m\n", sock->ip);

// Connect to the server and check if connect fails
if( (sock->con = connect(sock->sockfd, (struct sockaddr *)&serv_addr,
sock->addrlen) ) == SYS_ERR)
handle_err(CONNECT_ERR);

/* Send a message to the server, this is so
* trivial, only for funny!!! :-)
*/
sock->bytes_wrote = write(sock->sockfd, sended, strlen(sended));

// If cannot send message
if(sock->bytes_wrote == SYS_ERR)
handle_err(WRITE_ERR);

// Read data from server
sock->bytes_read = recv(sock->sockfd, sock->buffer, MAX_SIZE, 0);

// If read fails ...
if(sock->bytes_read == SYS_ERR)
handle_err(READ_ERR);

sock->buffer[sock->bytes_read] == '\0';
// Print the server welcome message
write(STDOUT_FILENO, sock->buffer, MAX_SIZE);

cin = fdopen(sock->sockfd, "r");

fgets(cbuff, MAX_SIZE, cin);
fputs(cbuff, stdout);

// Ask for USER
setattr(BOLD);
setcolor(FOREYELLOW);
cprintf("USER: ");
setattr(NORMAL);
setattr(BOLD);
fgets(sock->user, MAX_SIZE, stdin);

// Ask for Password
setattr(BOLD);
setcolor(FOREYELLOW);
cprintf("PASS: ");
setattr(NORMAL);
setattr(BOLD);
fgets(sock->pass, MAX_SIZE, stdin);

// Send USER to FTP server
send(sock->sockfd, sock->user, MAX_SIZE, 0);
// Send PASS to FTP Server
send(sock->sockfd, sock->pass, MAX_SIZE, 0);

// Close socket
close(sock->sockfd);

// Set the original terminal's status
setattr(NORMAL);
normvideo();

return 0;
}


/** cnet.h -- global header **/

/* A simple client to open connection
* to servers and comunicate with them,
* like telnet.
*/

#ifndef _CNET_H
#define _CNET_H

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>

#ifndef _TTK_H
#include <ttk.h>
#endif

#define VERSION 0.2
#define COPYLEFT "\nCopyleft (C) Vinicio Flores\nAll rights
reversed\n\rThis program is free software, it is licensed under the GNU
GPL\n\rRead LICENSE for more information\n\r"
#define CRAP "\nYou can do with it all that you want, join
us and share the software\n"

/* The max size of a memory buffer */

#define MAX_SIZE 800

#define SYS_ERR -1 // The error value that an UNIX system call
returns

// Boolean types and other data types
typedef enum { false, true } bool;

typedef char *String;
typedef char Buffer[MAX_SIZE];

typedef unsigned char byte;
typedef unsigned char octet;
typedef unsigned short word;
typedef unsigned int dword;

/* Some error values
* of diferent system calls
*/

#define NEED_ARGC 0x00
#define OPENSOCK_ERR 0x01
#define CONNECT_ERR 0x02
#define GETHOST_ERR 0x03
#define READ_ERR 0x04
#define WRITE_ERR 0x05


struct sock_client
{
int sockfd;
int bytes_read, bytes_wrote;
int con;
int n_port;
Buffer buffer;
socklen_t addrlen;
String ip;
Buffer user, pass;
};

/* Routines to handle errors */

extern void handle_err(int);

#endif // _CNET_H


/** Some routines used by cnet **/

/* Some routines used by cnet */

#ifndef _CNET_H
#include "cnet.h"
#endif

/* Handle and process common errors */
void handle_err(int n_error)
{
switch(n_error)
{
case OPENSOCK_ERR:
perror("Error while opening socket");
exit(OPENSOCK_ERR);
break;
case CONNECT_ERR:
perror("Error while trying to connect to server");
exit(CONNECT_ERR);
break;
case NEED_ARGC:
reset();
setattr(REVERSE);
setcolor(FORERED);
cprintf("Cnet v%3.1f\n", VERSION);
setattr(NORMAL);
setattr(BOLD);
setcolor(FORECYAN);
cprintf("Usage: ");
setattr(NORMAL);
cprintf("cnet <hostname> <n_port> Example(");
setattr(UNDERLINE);
cprintf("cnet ftp.gnu.org 21");
setattr(NORMAL);
cprintf(")\n");
normvideo();

setattr(BOLD|REVERSE);
cprintf("\nAbout Cnet \n");

setattr(NORMAL);

cprintf("\t\tCnet is a terminal-based program that connects to a
server, like Telnet\n\r");
cprintf("\t\tCnet aims to be an enhanced and minimalistic telnet
program\n\r");
cprintf("\t\tThis is an alpha release and maybe it will not work
properly, please download the cnet source code and work on it\n\r");
cprintf("%s%s\n\r", COPYLEFT, CRAP);

exit(NEED_ARGC);
break;
case GETHOST_ERR:
setcolor(FORERED);
cprintf("Error, no such host\n");
setattr(NORMAL);
normvideo();
exit(GETHOST_ERR);
break;
case READ_ERR:
perror("Read error");
setattr(NORMAL);
normvideo();
exit(READ_ERR);
break;
case WRITE_ERR:
perror("Write error");
exit(WRITE_ERR);
break;
}
}

// And here is the Makefile

# Makefile for cnet

CFLAGS=-O -O2 -O3 -g -Wall -lttk -DMONOLITH -fwhole-program -Ofast -
fcommon -Werror

BINARY=cnet
CC=gcc

all:
$(CC) -c *.c
$(CC) -o $(BINARY) *.o $(CFLAGS)

clean:
rm *.o $(BINARY)

install:
cp cnet /usr/bin

PS: Please tell me what can I do more here!!!!

Vinicio Flores

unread,
Jul 4, 2011, 12:45:56 AM7/4/11
to

Buffer cbuff;

setattr(BOLD);
setcolor(FOREGREEN);

return 0;
}

#ifndef _CNET_H
#define _CNET_H

#define MAX_SIZE 800

extern void handle_err(int);

#endif // _CNET_H

setattr(NORMAL);

# Makefile for cnet

BINARY=cnet
CC=gcc

clean:
rm *.o $(BINARY)

install:
cp cnet /usr/bin

PS2: That's all that I want!!!! Thank you !!!

J.A. Gutierrez

unread,
Jul 8, 2011, 3:46:36 AM7/8/11
to
Vinicio Flores <vflor...@gmail.com> wrote:
: Can you tell me what I have to know if I want to write a FTP Client??

http://www.ietf.org/rfc/rfc959.txt

: And can you tell me how can I do it??

http://webdiis.unizar.es/~spd/src/net/tcp-client.c


: And if you have a good UNIX sockets howto to give, please give me
: one!!!!

http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq.html

--
PGP and other useless info at \
http://webdiis.unizar.es/~spd/ \
finger://daphne.cps.unizar.es/spd \ Timeo Danaos et dona ferentes
ftp://ivo.cps.unizar.es/pub/ \ (Virgilio)

Jorge Chamorro Bieling

unread,
Jul 12, 2011, 12:58:42 PM7/12/11
to
On Jul 8, 9:46 am, "J.A. Gutierrez" <s...@daphne.cps.unizar.es> wrote:

> Vinicio Flores <vflores...@gmail.com> wrote:
>
> : Can you tell me what I have to know if I want to write a FTP Client??
>
>        http://www.ietf.org/rfc/rfc959.txt
>
> : And can you tell me how can I do it??
>
>        http://webdiis.unizar.es/~spd/src/net/tcp-client.c
>
> : And if you have a good UNIX sockets howto to give, please give me
> : one!!!!
>
>        http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-...
>

También puede resultar muy útil echar una mirada a <http://nodejs.org>

Saludos,
--
Jorge Chamorro.

0 new messages