Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define portno 3386
void clientProcess(char *argv[]) {
extern LABEL;
int sockfd,n;
struct sockaddr_in serverAdd;
struct hostent *server;
char buffer[256];
// Create Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("clientProcess ERROR: Socket Not Created");
}
server = gethostbyname("127.0.0.1");//argv[1]);
if (server == NULL) {
printf(" No such HOST\n");
exit(0);
}
bzero((char *) &serverAdd, sizeof(serverAdd));
serverAdd.sin_family = AF_INET;
bcopy((char *)server->h_addr,(char *)&serverAdd.sin_addr.s_addr,server->h_length);
serverAdd.sin_port = htons(portno);
if (connect(sockfd,(const struct sockaddr *)&serverAdd,sizeof(serverAdd)) < 0) {
printf("clientProcess ERROR : NO Connect\n");
exit(0);
}
printf("-----------Inside clientProcess-------------\n\n");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0) {
printf("clientProcess ERROR: Writing \n");
}
bzero(buffer,256);
close(sockfd);
}
void serverProcess(char *argv[], int pid1) {
int sockfd, newsockfd, clilen, n;
int sel, i;
char buffer[256];
struct sockaddr_in serverAdd, clientAdd;
fd_set active_fd, read_fd; // two fd's
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
FD_ZERO(&active_fd); // set zero for active_fd
FD_SET(sockfd, &active_fd);
pid_t pid;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
printf("----------serverProcess Running-------\n");
if (sockfd < 0) {
printf("serverProcess ERROR: Opening Socket\n");
exit(0);
}
bzero((char *) &serverAdd, sizeof(serverAdd));
serverAdd.sin_family = AF_INET;
serverAdd.sin_addr.s_addr = INADDR_ANY;
serverAdd.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serverAdd,sizeof(serverAdd)) < 0) {
printf("serverProcess ERROR: on Binding\n");
pid = getpid();
kill(pid1, SIGKILL);
exit(0);
}
listen(sockfd,1);
while (1) {
read_fd = active_fd;
sel = select(sockfd+1, &read_fd, NULL, NULL, &timeout);
if(sel < 0) {
printf("select ERROR\n");
}
for(i = 0; i< (sockfd+1); i++) {
if (FD_ISSET(i, &read_fd)) {
if(i == sockfd) {
clilen = sizeof(clientAdd);
if ( (newsockfd = accept(sockfd, (struct sockaddr *)&clientAdd, &clilen) < 0)){
printf("ERROR SERVER: Accept() failed\n");
exit(1);
}
} else {
//make child process
printf("forking now\n");
pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
}
if (pid == 0) { //child process
printf("this is the child\n");
// The sockfd has data to be read
close(sockfd);
n = read(newsockfd, buffer, 255);
printf("received size: %d\n", n);
printf("%s\n", buffer);
close(newsockfd);
} else { //parent process
printf("This is the parents\n");
close(newsockfd);
}
}
}
}
}
close(newsockfd);// Close accepct descriptor
close(sockfd); // Close socket descriptor
}
int main(int argc, char *argv[]) {
int pid1, pid2;
if(argc < 1) {
printf("USEAGE: ./socket <portno> <localhost>\n");
exit(0);
}
pid1 = fork();
if(pid1 > 0) {
serverProcess(argv, pid1);
} else {
sleep(3);
clientProcess(argv);
}
return (0);
}