Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <errno.h>
void bail (char *msg){
fputs(strerror(errno),stderr);
fputs(": ",stderr);
fputs(msg,stderr);
fputc('\n',stderr);
exit(1);
}
char *resolve (const char *hostname){
struct hostent *hp;
hp = gethostbyname(hostname);
if(!hp){
bail("Error Resolving host");
}
char rstr = sprintf("%s",hp->h_addr_list[0]);
return hp->h_addr_list[0];
}
int makeaddr(void * addr, int len, int *s, char *type, char *ip, int port){
//takes &addr,sizeof(addr), &sock,"TCP",ipaddr, port number
int Default_port = 3099;
int yes = 1;
struct sockaddr_in *ad = (struct sockaddr_in *)addr;
memset(ad,0,len);
ad->sin_family = AF_INET;
if(!ip){
ad->sin_addr.s_addr = INADDR_ANY;
}
else{
ad->sin_addr.s_addr = inet_addr(ip);
}
if(port == 0){
printf("\n Port = 0\nDefault port = %d\n",Default_port);
ad->sin_port = htons(Default_port);
}
else{
Default_port = port;
ad->sin_port = htons(port);
}
//we have created the address structure. Now create the socket
if(strcmp(type,"TCP")==0){
if((*s = socket(AF_INET,SOCK_STREAM,0))== -1)
bail("TCP Sock Error");
if(setsockopt(*s, SOL_SOCKET,SO_REUSEADDR, &yes, sizeof(int))==-1)
bail("Unable to set socket options");
if(bind(*s,(struct sockaddr*)ad,len)== -1){
bail("TCP Bind Error");
}
printf("TCP Socket Successfully created: On Port %d \n",Default_port);
}
else if(strcmp(type,"PASS")==0){
//nothing.
}
else{
if((*s = socket(AF_INET,SOCK_DGRAM,0))== -1)
bail("UDP Sock Error");
if(setsockopt(*s, SOL_SOCKET,SO_REUSEADDR, &yes, sizeof(int))== -1)
bail("Unable to set socket options");
if(bind(*s,(struct sockaddr*)ad,len)== -1){
bail("UDP Bind Error");
}
printf("UDP Socket Successfully created: On Port %d \n",Default_port);
}
}
int main(int argc, char *argv[]){
int sock;
int clisock;
struct sockaddr_in addr, cli_addr;
//takes &addr,sizeof(addr), &sock,"TCP",ipaddr, port number
//makeaddr(&addr,sizeof(addr),&sock,"UDP",NULL,0);
int flag_listen = 0;
int flag_listen_port = 0;
int flag_sendFile = 0;
int flag_filename = 0;
int i = 1;
int cli_len;
int flag_getfile = 0;
int flag_getfilePort = 0;
for(i = 0; i < argc; i++){
if(strcmp(argv[i],"-l")==0){
flag_listen = i;
flag_listen_port = i + 1;
if(argc <= flag_listen_port)
bail("No Port Number Set\n");
}
if(strcmp(argv[i],"-sF")==0){
if(flag_listen == 0)
bail("You need to specify a -l [portnumber] to use this function.\n");
flag_sendFile = i;
flag_filename = i + 1;
if(argc <= flag_filename)
bail("No Filename Set\n");
}
if(strcmp(argv[i],"-gF")==0){
flag_getfile = i;
flag_getfilePort = i + 1;
if(argc <= flag_getfilePort)
bail("Specify Port Number To connect too\n");
}
}
//we got here we might have a logical command.
if(flag_getfile > 0 && flag_getfilePort > 1){
makeaddr(&addr,sizeof(addr),&sock,"PASS","127.0.0.1",flag_getfilePort);
if(sock = socket(AF_INET,SOCK_STREAM,0) == -1) /*The reason ive got this here was because i passed it with TCP instead of pass it tried to bind and errored*/
bail("Socket Error");
if(connect(sock,(struct sockaddr *)&addr,sizeof(addr)) < 0)
bail("Error On Connection."); //errors here socket operation on non socket.
int bytes;
char buff[256];
int pkt = 1;
for(;;){
bytes = recv(sock,buff,sizeof(buff),0);
printf("Packet Recieved %d\n",pkt);
printf("Total Bytes: %d\n",bytes);
printf("Dump:\n%s",buff);
if(strcmp(buff,"END")==0)
break;
}
printf("loop Exit.");
close(sock);
}
if(flag_listen > 0 && flag_sendFile > 0){
char sndBuf[256];
FILE *p;
//program didnt bail out so must have logical port command
p = fopen(argv[flag_filename],"r");
//bail(argv[flag_filename]);
//make socket address
makeaddr(&addr,sizeof(addr),&sock,"TCP",NULL,atoi(argv[flag_listen_port]));
//we should now have a bind socket.
printf("Listening on port %d - Waiting for connection...\nReady to send file: %s\n",atoi(argv[flag_listen_port]),argv[flag_filename]);
listen(sock,5);
cli_len = sizeof(cli_addr);
if(clisock = accept(sock,(struct sockaddr *) &cli_addr, &cli_len)== -1)
bail("Error Accepting Remote connection\n");
printf("Connection Established. Sending File: %s\n\n",argv[flag_filename]);
//read and write.
int bytes_sent;
int jj = 1;
//sndBuf
while(fgets(sndBuf,256,p)!= NULL){
//write the file to the client.
bytes_sent = send(clisock,sndBuf,sizeof(sndBuf),0);
printf("Sent packet %d\n",jj);
jj++;
printf("Total Bytes Sent: %d\n",bytes_sent); //this always remains at -1 error??
printf("Dump:\n%s\n\n",sndBuf);
//sleep(2); //wont sleep keeps sending packets of data very fast
}
int k = strlen("END");
send(clisock,"END",k,0);
}
else{printf("Usage: ./ma [-sF send file] [-gF get File]\n");}
close(sock);
return 0;
}