1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h> /* for sockaddr_un struct */
#include <string.h>
#include "country.h"
#define DEFAULT_PROTOCOL 0
/* POSIX renames "Unix domain" as "local IPC."
Not all systems define AF_LOCAL and PF_LOCAL (yet). */
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
/****************************************************************/
int main ()
{
int serverFd, clientFd, serverLen, clientLen;
struct sockaddr_un serverAddress;/* Server address */
struct sockaddr_un clientAddress; /* Client address */
struct sockaddr* serverSockAddrPtr; /* Ptr to server address */
struct sockaddr* clientSockAddrPtr; /* Ptr to client address */
/* Ignore death-of-child signals to prevent zombies */
signal (SIGCHLD, SIG_IGN);
serverSockAddrPtr = (struct sockaddr*) &serverAddress;
serverLen = sizeof (serverAddress);
clientSockAddrPtr = (struct sockaddr*) &clientAddress;
clientLen = sizeof (clientAddress);
/* Create a socket, bidirectional, default protocol */
serverFd = socket (AF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL);
serverAddress.sun_family = AF_LOCAL; /* Set domain type */
strcpy (serverAddress.sun_path, "country"); /* Set name */
unlink ("country"); /* Remove file if it already exists */
bind (serverFd, serverSockAddrPtr, serverLen); /* Create file */
listen (serverFd, 5); /* Maximum pending connection length */
printf ("%s \n", "Starting Country Server");
printf ("%s \n", " ");
while (1) /* Loop forever */
{
/* Accept a client connection */
clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);
if (fork () == 0) /* Create child to send recipe */
{
//writeCountryData (clientFd); /* Send the recipe */
while(1)
{
readCountry (clientFd);
close (clientFd); /* Close the socket */
exit (/* EXIT_SUCCESS */ 0); /* Terminate */
}
else
close (clientFd); /* Close the client descriptor */
}
return 0;
}
/****************************************************************/
readCountry (int fd)
{
readData();
char capital[100]="", currencyCode[100]="", *p;
char userInput[200];
read(fd, userInput, 200);
if ((p = strchr(userInput, '\n')) != NULL) /* to remove the [enter] from userinput */
*p = '\0';
strcat(capital,userInput) ;
strcat(capital," Capital : ") ;
strcat(capital,getCapital (userInput));
write (fd, capital, strlen (capital) + 1);
strcat(currencyCode,userInput) ;
strcat(currencyCode," Currency Code : ") ;
strcat(currencyCode,getCurrencyCode (userInput));
write (fd, currencyCode, strlen (currencyCode) + 1);
}
readLine (int fd, char* str)
{
int n;
do /* Read characters until NULL or end-of-input */
{
// ssize_t read (int fd, void *buf, size_t count);
// if successful, read will:
// a) stores data read into 'buf', and
// b) returns the no. of bytes read
// read returns zero if it reaches end-of-input
n = read (fd, str, 1); /* Read one character */
}
while (n > 0 && *str++ != 0);
return (n > 0); /* Return false if end-of-input */
}
}
|