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