Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <signal.h>
- #include <wait.h>
- void error(const char *msg)
- {
- perror(msg);
- exit(1);
- }
- void signal_handler(int i)
- {
- printf("\nCaught signal I have to go now...BYEEE\n");
- exit(i);
- }
- void wait_handler(int sig)
- {
- pid_t pid;
- pid = wait(NULL);
- printf("Pid %d exited.\n", pid);
- }
- void parse(char *vector[20], char *line){
- int i;
- char * pch;
- pch = strtok (line," ");
- i=0;
- while (pch != NULL)
- {
- vector[i]=pch;
- printf ("%s\n",pch);
- pch = strtok (NULL, " ");
- i++;
- }
- printf("i = %d\n ", i);
- vector[i]=NULL;
- int k=0;
- for(k=0; k<=i; k++) {
- printf("vector %d = %s \n",k,vector[k]);
- }
- }
- int main(int argc, char *argv[]) {
- signal(SIGINT,signal_handler);
- signal(SIGCHLD, wait_handler);
- int sockfd,newsockfd,portno;
- socklen_t clilen;
- char buffer[256];
- struct sockaddr_in serv_addr, cli_addr;
- int n,pid,status;
- char str[INET6_ADDRSTRLEN];
- if (argc < 2)
- {
- fprintf(stderr,"No port provided\n");
- exit(1);
- }
- sockfd = socket(AF_INET,SOCK_STREAM,0);
- if(sockfd < 0)
- error("ERROR opening socket");
- memset((char *) &serv_addr, 0, sizeof(serv_addr));
- portno = atoi(argv[1]);
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = INADDR_ANY;
- serv_addr.sin_port = htons(portno);
- if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
- error("ERROR on binding");
- listen(sockfd, 5);
- clilen = sizeof(cli_addr);
- printf("Server running\n");
- for(;;) {
- newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
- if (newsockfd < 0)
- error("ERROR on accept");
- if (inet_ntop(AF_INET, &cli_addr.sin_addr, str, INET_ADDRSTRLEN) == NULL) {
- fprintf(stderr, "Could not convert byte to address \n");
- exit(1);
- }
- fprintf(stdout, "The client address is :%s\n", str);
- pid=fork();
- if (pid < 0){
- error("Error in fork");
- }
- else if (pid > 1){ // Father
- close(newsockfd);
- }
- else if(pid == 0) {
- for(;;)
- {
- bzero(buffer, 256);
- n = read(newsockfd, buffer, 255);
- if (n < 0) error("ERROS reading from socket");
- if (n == 0)
- {
- printf("Client disconnected\n");
- exit(1);
- }
- printf("Here is the message: %s\n", buffer);
- n = write(newsockfd, "message received", 17);
- if (n < 0) error("ERROR writing to socket");
- if ((pid=fork())==-1) /*check for error*/
- {
- error("Error with fork!");
- exit(1);
- }
- if (pid!=0) /*The parent process*/
- {
- printf("I am parent process %d\n",getpid());
- printf("Child terminated with exit code %d\n",
- status>>8);
- }
- else /*The child process*/
- {
- char line[1024];
- int i;
- char *vector[20];
- line[strcspn(line, "\n")] = 0;
- printf("\n");
- printf("You typed %s\n",buffer);
- parse(vector,buffer);
- printf("I am child Process %d \n",getpid());
- printf("and i will replace myself by %s\n",buffer);
- execvp(vector[0],vector);
- perror("execvp");
- exit(1);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement