Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int sockfd, portno, readfd, writefd, yes = 1;
char buffer[1026];
memset(buffer, 0, sizeof(buffer));
struct hostent *server;
struct sockaddr_in serv_addr, cli_addr;
if(argc < 4)
{
fprintf(stderr, "Ussage: %s + IP Address + port No. + file path.\n", argv[0]);
exit(0);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
fprintf(stderr, "%s.", strerror(errno));
exit(1);
}
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
bzero((char *) &serv_addr, sizeof(serv_addr));
server = gethostbyname(argv[1]);
if(server == NULL)
{
fprintf(stderr, "No such host.\n");
printf("%s\n", strerror(errno));
exit(1);
}
portno = atoi(argv[2]); //Grabbing the port number from the command line
serv_addr.sin_family = AF_INET;
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if(connect(sockfd, (const struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
fprintf(stderr, "%s. CONNECT()\n", strerror(errno));
exit(1);
}
else
{
printf("Made a connection to %s\n", inet_ntoa(serv_addr.sin_addr));
}
for( ; ; )
{
int size, count = 0;
FILE *fd;
fd = fopen(argv[3], "r");
fseek(fd, 0, SEEK_END);
size = ftell(fd);
rewind(fd);
if(fd < 0)
{
printf("%s", strerror(errno));
exit(EXIT_FAILURE);
}
if(fd == NULL)
{
printf("%s. FD(NULL)\n", strerror(errno));
exit(EXIT_FAILURE);
}
else if(fd)
{
while(count < size)
{
if((fread(buffer, sizeof(buffer), 1, fd)) != '\0')
{
fread(buffer, sizeof(buffer), 1, fd);
}
if (buffer[strlen(buffer) -1] == '\n')
buffer[strlen(buffer)-1] = '\0';
count++;
}
writefd = write(sockfd, buffer, strlen(buffer));
if(writefd <= 0)
{
printf("%s. WRITE(-1).\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
if((readfd = read(sockfd, buffer, sizeof(buffer))) < 0);
{
fprintf(stderr, "Error reading message from %s\n", inet_ntoa(cli_addr.sin_addr));
printf("%s. READ(c)\n", strerror(errno));
exit(0);
}
//Test to see if the buffer is blank. Uncomment to test.
if(readfd == 0)
{
printf("Null buffer. READ(0)\n");
}
else
{
fprintf(stdout, "%s", buffer);
}
}
close(sockfd);
return 0;
}