From 53a222bf9fb304a7d5e62ecd7f299ef42843efcb Mon Sep 17 00:00:00 2001
From: Saleh Ahmed Khan <s.khan20@student.unimelb.edu.au>
Date: Sat, 14 Apr 2018 16:41:20 +1000
Subject: [PATCH] Workig test client/server (debugged previous using sample
 code)

---
 client.c | 116 ++++++++++++++++++++++++++++++++++++-----------
 server.c | 134 ++++++++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 193 insertions(+), 57 deletions(-)

diff --git a/client.c b/client.c
index c5dfe84..50b076d 100644
--- a/client.c
+++ b/client.c
@@ -1,38 +1,104 @@
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
+
+/* 
+ * Client program based on sample code
+ */
+
 #include <stdio.h>
-#include <string.h>
 #include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h> 
 #include <unistd.h>
-#include <netdb.h>
 
 
+int main(int argc, char* argv[])
+{
+	int sockfd, portno, n;
+	struct sockaddr_in serv_addr;
+	struct hostent *server;
+
+	char buffer[256];
+
+	if (argc < 3) 
+	{
+		fprintf(stderr,"usage %s hostname port\n", argv[0]);
+		exit(0);
+	}
+
+	portno = atoi(argv[2]);
+
+	
+	/* Translate host name into peer's IP address ;
+	 * This is name translation service by the operating system 
+	 */
+	server = gethostbyname(argv[1]);
+	
+	if (server == NULL) 
+	{
+		fprintf(stderr,"ERROR, no such host\n");
+		exit(0);
+	}
+	
+	/* Building data structures for socket */
+
+	bzero((char *) &serv_addr, sizeof(serv_addr));
+
+	serv_addr.sin_family = AF_INET;
+
+	bcopy((char *)server->h_addr, 
+			(char *)&serv_addr.sin_addr.s_addr,
+			server->h_length);
+
+	serv_addr.sin_port = htons(portno);
+
+	/* Create TCP socket -- active open 
+	* Preliminary steps: Setup: creation of active open socket
+	*/
+	
+	sockfd = socket(AF_INET, SOCK_STREAM, 0);
+	
+	if (sockfd < 0) 
+	{
+		perror("ERROR opening socket");
+		exit(0);
+	}
+	
+	if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
+	{
+		perror("ERROR connecting");
+		exit(0);
+	}
+
+	/* Do processing
+	*/
+	
+	printf("Please enter the message: ");
 
-void main(int argc, char *argv[]) {
-    int sockfd = 0 /*listenfd*/, connfd = 0, n = 0;
-    char recvBuff[1025];
-    struct sockaddr_in serv_addr;
-    struct hostent *server;
+	bzero(buffer,256);
 
-    sockfd = socket(AF_INET, SOCK_STREAM, 0); //create socket
+	fgets(buffer,255,stdin);
 
-    server = gethostbyname(argv[1]);
+	n = write(sockfd,buffer,strlen(buffer));
 
-    memset(&serv_addr, '0', sizeof(serv_addr)); //initialise server address
-    memset(recvBuff, '0', sizeof(recvBuff)); //initialise RECEIVE buffer
-    bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length);
-    serv_addr.sin_family = AF_INET; //Type of address – internet IP
-    serv_addr.sin_port = htons(atoi(argv[2])); // port no
+	if (n < 0) 
+	{
+		perror("ERROR writing to socket");
+		exit(0);
+	}
+	
+	bzero(buffer,256);
 
-    if (connect(sockfd,  (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
-        printf("Error connecting to server\n");
-    } else {
-        printf("%s server\n", (char*)&serv_addr);
-    }
+	n = read(sockfd,buffer,255);
+	
+	if (n < 0)
+	{
+		perror("ERROR reading from socket");
+		exit(0);
+	}
 
+	printf("%s\n",buffer);
 
-    while ((n = read(connfd, recvBuff, sizeof(recvBuff)-1)) > 0) {
-        printf("%s\n\n", recvBuff);
-    }
+	return 0;
 }
diff --git a/server.c b/server.c
index c8c29d3..35a9984 100644
--- a/server.c
+++ b/server.c
@@ -1,37 +1,107 @@
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
+/* 
+ * Server program based on sample code
+ */
+
 #include <stdio.h>
-#include <string.h>
 #include <stdlib.h>
+#include <string.h>
+#include <sys/types.h> 
+#include <sys/socket.h>
+#include <netinet/in.h>
 #include <unistd.h>
 
 
-void main(int argc, char *argv[]) {
-    int listenfd = 0, connfd = 0;
-    char sendBuff[1025];
-    struct sockaddr_in serv_addr;
-
-    listenfd = socket(AF_INET, SOCK_STREAM, 0); //create socket
-    if (listenfd < 0) {
-        printf("Error creating socket\n");
-    }
-    memset(&serv_addr, '0', sizeof(serv_addr)); //initialise server address
-    memset(sendBuff, '0', sizeof(sendBuff)); //initialise send buffer
-    serv_addr.sin_family = AF_INET; //Type of address – internet IP
-    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //Listen on ANY IP Addr
-    // serv_addr.sin_port = htons(5000); //Listen on port 5000
-    serv_addr.sin_port = htons(atoi(argv[1]));
-    if (bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
-        printf("Error binding\n");
-    }
-    listen(listenfd, 10); // maximum number of client connections to queue
-
-    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
-    if (connfd < 0) {
-        printf("Error accepting\n");
-    }
-    snprintf(sendBuff, sizeof(sendBuff), "Hello World!");
-    write(connfd, sendBuff, strlen(sendBuff));
-    close(connfd);
-}
\ No newline at end of file
+int main(int argc, char *argv[])
+{
+	int sockfd, newsockfd, portno;
+	char buffer[256];
+	struct sockaddr_in serv_addr, cli_addr;
+	socklen_t clilen;
+	int n;
+
+	if (argc < 2) 
+	{
+		fprintf(stderr,"ERROR, no port provided\n");
+		exit(1);
+	}
+
+	 /* Create TCP socket */
+	
+	sockfd = socket(AF_INET, SOCK_STREAM, 0);
+
+	if (sockfd < 0) 
+	{
+		perror("ERROR opening socket");
+		exit(1);
+	}
+
+	
+	bzero((char *) &serv_addr, sizeof(serv_addr));
+
+	portno = atoi(argv[1]);
+	
+	/* Create address we're going to listen on (given port number)
+	 - converted to network byte order & any IP address for 
+	 this machine */
+	
+	serv_addr.sin_family = AF_INET;
+	serv_addr.sin_addr.s_addr = INADDR_ANY;
+	serv_addr.sin_port = htons(portno);  // store in machine-neutral format
+
+	 /* Bind address to the socket */
+	
+	if (bind(sockfd, (struct sockaddr *) &serv_addr,
+			sizeof(serv_addr)) < 0) 
+	{
+		perror("ERROR on binding");
+		exit(1);
+	}
+	
+	/* Listen on socket - means we're ready to accept connections - 
+	 incoming connection requests will be queued */
+	
+	listen(sockfd,5);
+	
+	clilen = sizeof(cli_addr);
+
+	/* Accept a connection - block until a connection is ready to
+	 be accepted. Get back a new file descriptor to communicate on. */
+
+	newsockfd = accept(	sockfd, (struct sockaddr *) &cli_addr, 
+						&clilen);
+
+	if (newsockfd < 0) 
+	{
+		perror("ERROR on accept");
+		exit(1);
+	}
+	
+	bzero(buffer,256);
+
+	/* Read characters from the connection,
+		then process */
+	
+	n = read(newsockfd,buffer,255);
+
+	if (n < 0) 
+	{
+		perror("ERROR reading from socket");
+		exit(1);
+	}
+	
+	printf("Here is the message: %s\n",buffer);
+
+	n = write(newsockfd,"I got your message",18);
+	
+	if (n < 0) 
+	{
+		perror("ERROR writing to socket");
+		exit(1);
+	}
+	
+	/* close socket */
+	
+	close(sockfd);
+	
+	return 0; 
+}
-- 
GitLab