A minimalist telnet-like client



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!!!

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!!!!

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

.



Relevant Pages

  • RE: SSPI Kerberos for delegation
    ... you have to check on 'trust this machine for delegation' in the server computer's ADUC property page. ... Doing this will tell the client kerberos package that it should get a forwardable ticket and that it should forward it ... int n = ib.cbBuffer; ... // wserr() displays winsock errors and aborts. ...
    (comp.protocols.kerberos)
  • Re: bin/131567: Update for regression/sockets/unix_cmsg
    ... -Usually each test does following steps: create Server, fork Client, ... Sometimes Client sends several ... +in the msg_iov field from struct msghdr. ... Receiving sockcred (listening socket has LOCAL_CREDS) ...
    (freebsd-net)
  • [NT] Dark Age of Camelot Man-In-The-Middle
    ... use of RSA public key cryptography and an RC4 based symmetric algorithm. ... Seeing the imminent release of code for cracking the game client (which ... At the beginning of each TCP session, the server sends a 1536 bit RSA ... void bytes_out(unsigned char *data, int len) ...
    (Securiteam)
  • echo client using threads
    ... pollwhile client is written using threads. ... server recvs some characters from a client and then echoes the ... int main ... exit(EXIT_FAILURE); ...
    (comp.unix.programmer)
  • Re: Problem with SslStream when using Windows Vista
    ... The code for the server & client follow. ... private int _port = 0; ... // SslStream using the client's network stream. ...
    (microsoft.public.dotnet.framework)