Example #1
0
static void sighandler(int p)
{
    if(p == SIGUSR1)
    {
        signal(SIGUSR1,sighandler);
        int cm = *x;
        printf("Signalled %d\n",cm);
        if(cm==0)
        {
            if(count>=1)
                send_file_descriptor(ucss[cm],sq[(--count)]);
            else
                flag[cm] = 0;
        }
        else if(cm==1)
        {
            if(count>=1)
                send_file_descriptor(ucss[cm],sq[(--count)]);
            else
                flag[cm] = 0;
        }
        else if(cm==2)
        {
            if(count>=1)
                send_file_descriptor(ucss[cm],sq[(--count)]);
            else
                flag[cm] = 0;
        }
        sbuf.sem_op = 1;
        semop(sem,&sbuf,1);
    }
}
int main() {
  int fd[2] = {-1, -1};
  int server = -1, client = -1;
  FILE *fp = NULL;
  FILE *fp2 = NULL;
  fp = fopen("a.txt", "w");
  if (fp == NULL) {
    fprintf(stderr, "fopen(a.txt) failed: %s\n", strerror(errno));
    goto ERR_FOPEN;
  }
  fd[0] = fileno(fp);
  printf("a.txt:%d\n", fd[0]);

  fp2 = fopen("aa.txt", "w");
  if (fp2 == NULL) {
    fprintf(stderr, "fopen(aa.txt) failed: %s\n", strerror(errno));
    goto ERR_FOPEN;
  }
  fd[1] = fileno(fp2);
  printf("aa.txt:%d\n", fd[1]);
  server = create_server();
  if (server < 0) {
    fprintf(stderr, "create_server failed\n");
    goto ERR_CREATE_SERVER;
  }
  while(1) {
    client = accept(server, NULL, NULL);
    fprintf(stderr, "client accept %d\n", client);
    if (client < 0) {
      fprintf(stderr, "accept failed\n");
      goto ERR_ACCEPT;
    }

    if (send_file_descriptor(client, fd) < 0) {
      fprintf(stderr, "send_file_descriptor failed: %s\n", strerror(errno));
      goto ERR_SEND_FILE_DESCRIPTOR;
    }

    if (shutdown(client, SHUT_RDWR) < 0) {
      fprintf(stderr, "shutdown failed: %s\n", strerror(errno));
      goto ERR_SHUTDOWN;
    }
  }

ERR_SHUTDOWN:
ERR_SEND_FILE_DESCRIPTOR:
  close(client);
ERR_ACCEPT:
  close(server);
ERR_CREATE_SERVER:
  fclose(fp);
  fclose(fp2);
ERR_FOPEN:
  return 0;
}
Example #3
0
static void
do_server(int shmfd)
{
    int listenfd;

    listenfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (listenfd == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    struct sockaddr_un saddr = {0};
    saddr.sun_family = AF_UNIX;

    strcpy(saddr.sun_path, UNIX_DOMAIN_PATH);

    unlink(saddr.sun_path);

    if (bind(listenfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr_un)) == -1) {
        perror("bind");
        goto error;
    }

    if (listen(listenfd, 128) == -1) {
        perror("listen");
        goto error;
    }

    int sockfd;

    sockfd = accept(listenfd, NULL, NULL);
    if (sockfd == -1) {
        perror("accept");
        goto error;
    }

    setnonblocking(sockfd);

    send_file_descriptor(sockfd, shmfd);

    close(sockfd);
    close(listenfd);

    unlink(saddr.sun_path);

    return;

error:
    close(listenfd);
    exit(EXIT_FAILURE);
}
Example #4
0
File: c.c Project: saitej3/CN
int main()
{
	int sfd,sfd1;
	struct sockaddr_un serv_addr,client_addr;
	struct sockaddr_un serv_addrs;

	int len=sizeof(client_addr);

	serv_addr.sun_family=AF_UNIX;
	strcpy(serv_addr.sun_path,"echo_socket_c");

	serv_addrs.sun_family=AF_UNIX;
	strcpy(serv_addrs.sun_path,"echo_socket_cs");

	sfd1=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd1,"socket error");
	error_func(connect(sfd1,(struct sockaddr*)&serv_addrs,sizeof(serv_addrs)),"connect error");
	send(sfd1,"From server c to server s",30,0);
	
	sfd=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd,"socket error");
	unlink(serv_addr.sun_path);

	error_func(bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"bind error");
	error_func(listen(sfd,5),"listen error");
	
	char buffer[30];
	int nfd=accept(sfd,(struct sockaddr*)&client_addr,&len);
	error_func(nfd,"accept error");
	recv(nfd,buffer,sizeof(buffer),0);
	printf("%s\n",buffer);

	int clients_no=0;
	while(1)
	{
		int fd=recv_file_descriptor(nfd);
		printf("File descriptor%d\n",fd);
		if(clients_no>=max_clients)
		{
			printf("%s\n","max reached of server c");
			send_file_descriptor(sfd1,fd);
		}
		else
			pthread_create(&threads[clients_no++],NULL,func,(void *)(&fd));
	}


}
Example #5
0
File: server.c Project: saitej3/CN
void handler_func()
{
	kill(pid,SIGUSR1); //signal backupserver
	printf("%s\n","The server is about to shutdown");
	int i;
	printf("count of no_cients%d\n",clients_no);
	
	for(i=0;i<max_clients;i++)
	{
		if(cfd[i]==-1) break;
		printf("fd %d\n",cfd[i]);
		send_file_descriptor(bsfd,cfd[i]);
	}

	exit(0);
}
Example #6
0
File: server1.c Project: saitej3/CN
int main()
{
    int pid=0;
    pid=fork();

    if(pid==0)
    {
        sleep(5);
        printf("%s\n","child process");
        int sfd;
        struct sockaddr_un serv_addr;
        serv_addr.sun_family=AF_UNIX;
        strcpy(serv_addr.sun_path,"echo_socket");

        sfd=socket(AF_UNIX,SOCK_STREAM,0);
        error_func(sfd,"socket error");
        error_func(connect(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"connect error");
        int fd=recv_file_descriptor(sfd);
        printf("fd is child: %d\n",fd);
        char buffer[30];
        int nbytes;
        while(1)
        {
            scanf("parent bytes?%d",&nbytes);
            read(fd,buffer,nbytes);
            printf("child :%s\n",buffer);
            sleep(3);
        }
        send(sfd,"From client to server",30,0);
        recv(sfd,buffer,sizeof(buffer),0);
        printf("%s\n",buffer);
        close(sfd);
    }
    else
    {
        printf("%s\n","parent process");
        const char *filename = "sample.txt";
        int fd = open(filename, O_RDWR);

        printf("fd parent:%d\n",fd);
        int sfd;
        struct sockaddr_un serv_addr,client_addr;
        int len=sizeof(client_addr);
        serv_addr.sun_family=AF_UNIX;
        strcpy(serv_addr.sun_path,"echo_socket");
        sfd=socket(AF_UNIX,SOCK_STREAM,0);
        error_func(sfd,"socket error");
        unlink(serv_addr.sun_path);
        error_func(bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"bind error");
        error_func(listen(sfd,5),"listen error");

        int nfd=accept(sfd,(struct sockaddr*)&client_addr,&len);
        error_func(nfd,"accept error");
        send_file_descriptor(nfd,fd);

        int nbytes;
        char buffer1[30];
        while(1)
        {
            scanf("parent bytes?%d",&nbytes);
            read(fd,buffer1,nbytes);
            printf("parent :%s\n",buffer1);
            sleep(3);
        }
        char buffer[30];
        recv(nfd,buffer,sizeof(buffer),0);
        printf("%s\n",buffer);
        send(nfd,"hello from server",30,0);
        wait(NULL);
        close(nfd);
        close(sfd);
    }
}
Example #7
0
int main(void)
{
    int uss, bsfd[3], thop, len,sfd,sf;
    struct sockaddr_un local, remote;
    struct sockaddr_in ser_addr,cli_addr;
    char str[100];

    signal(SIGUSR1,sighandler);

    sem = semget(134,1,IPC_CREAT|0666);
    semctl(sem,0,SETVAL,1);
    xid = shmget(123,4,IPC_CREAT|0666);
    x =  shmat(xid,NULL,0);

    int i=0;


    for(i=0; i<3; i++)
    {
        bsfd[i] = socket(AF_INET,SOCK_STREAM,0); // socket create... AF_INET for IPv4 domain and SOCK_STREAM for connection oriented systems
        if(bsfd[i] < 0)
            perror("Socket create");
    }

    memset(&ser_addr,0,sizeof(struct sockaddr_in)); // Initialize to 0
    memset(&cli_addr,0,sizeof(struct sockaddr_in));

    ser_addr.sin_family = AF_INET;
    int portno = 27234;
    ser_addr.sin_port = htons(portno); // converts int to 16 bit integer in network byte order
    ser_addr.sin_addr.s_addr = INADDR_ANY; // to get IP address of machine on which server is running

    for(i=0; i<3; i++)
    {
        if(bind(bsfd[i],(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in))<0)
            perror("Bind error");
        portno++;
        ser_addr.sin_port = htons(portno);
    }
    for(i=0; i<3; i++)
        printf("%d\n",bsfd[i] );

    for(i=0; i<3; i++)
        if(listen(bsfd[i],10)<0) // No. of clients that server can service
            perror("Listen error");


    /*UNIX SOCKETS*/
    if ((uss = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, SOCK_PATH1);
    unlink(local.sun_path);
    len = strlen(local.sun_path) + sizeof(local.sun_family);
    if (bind(uss, (struct sockaddr *)&local, len) == -1) {
        perror("bind");
        exit(1);
    }

    if (listen(uss, 5) == -1) {
        perror("listen");
        exit(1);
    }



    // int css[3];
    int selfpid = getpid();
    for(i=0; i<3; i++)
    {
        char pid[10] = {'\0'};

        while((ucss[i] = accept(uss, (struct sockaddr *)&remote, &thop))<0);
        printf(" FD %d\n",ucss[i]);

        while(recv(ucss[i],pid,sizeof(pid),0)<=0);//printf("H");
        printf("Received %s\n",pid );
        pids[i] = atoi(pid);
        //itoa(selfpid,pid,10);
        snprintf(pid,10,"%d\n",selfpid);
        send(ucss[i],pid,sizeof(pid),0);
        printf("%d",pids[i]);
    }

    printf("PIDS EXCHANGED\n");


    for(i=0; i<3; i++)
    {
        printf("%d\n",ucss[i] );
        flag[i] = 0;
        count = 0;
    }

    fd_set readfds;




    struct timespec tim_dur;
    tim_dur.tv_sec = 5;   // waiting time of 1 sec for verifying set bits of FDSET
    tim_dur.tv_nsec = 0;

    while(1)
    {
        FD_ZERO(&readfds);
        FD_SET(bsfd[0],&readfds);
        FD_SET(bsfd[1],&readfds);
        FD_SET(bsfd[2],&readfds);
        int max = bsfd[0];


        for(i=0; i<3; i++)
            if(max<bsfd[i])
                max=bsfd[i];

        if(pselect(max+1,&readfds,NULL,NULL,&tim_dur,NULL)>0) // pselect is used as timeleft is not updated after each select call
        {
            for(i=0; i<3; i++)
            {
                if(FD_ISSET(bsfd[i],&readfds))
                {
                    printf("Client came have fun mr.server :P\n");
                    int nsfd = accept(bsfd[i], (struct sockaddr *)&remote, &thop); // Type cast sockaddr_in to sockaddr and pass by reference and pointer of length to be passed
                    if(nsfd < 0)
                        perror("Accept error");

                    int cm = i;
                    printf("Selected %d\n",cm );
                    int j=0;
                    for(j=0; j<3; j++)
                        printf("%d\n",flag[j] );
                    printf("\n");
                    for(j=0; j<3; j++)
                        if(flag[j]==0)
                            break;

                    printf("%d\n",j );
                    if(j<3)
                    {
                        printf("CSS %d nsfd %d\n",ucss[j],nsfd );
                        printf("%d\n",send_file_descriptor(ucss[j],nsfd));
                        flag[j]=1;
                    }
                    else
                    {
                        char sry[10];
                        strcpy(sry,"Wait!!");
                        send(nsfd,sry,sizeof(sry),0);
                        sq[count++] = nsfd;
                    }

                }
            }

        }
    }

    return 0;
}
Example #8
0
File: s.c Project: saitej3/CN
int main()
{
	int sfd,sfdcs,sfd1;
	struct sockaddr_un serv_addr,client_addr;
	struct sockaddr_un serv_addrcs,client_addres; //address of server1
	struct sockaddr_un serv_addrs;

	int lencs=sizeof(client_addres);
	int len=sizeof(client_addr);

	serv_addr.sun_family=AF_UNIX;
	strcpy(serv_addr.sun_path,"echo_socket_s");

	serv_addrs.sun_family=AF_UNIX;
	strcpy(serv_addrs.sun_path,"echo_socket_se");

	serv_addrcs.sun_family=AF_UNIX;
	strcpy(serv_addrcs.sun_path,"echo_socket_cs");

	sfdcs=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfdcs,"socket error");

	sfd1=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd1,"socket error");
	error_func(connect(sfd1,(struct sockaddr*)&serv_addrs,sizeof(serv_addrs)),"connect error");
	send(sfd1,"From server s to server e",30,0);
	
	sfd=socket(AF_UNIX,SOCK_STREAM,0);
	error_func(sfd,"socket error");
	unlink(serv_addr.sun_path);
	unlink(serv_addrcs.sun_path);

	error_func(bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)),"bind error");
	error_func(listen(sfd,5),"listen error");
	error_func(bind(sfdcs,(struct sockaddr*)&serv_addrcs,sizeof(serv_addrcs)),"bind error");
	error_func(listen(sfdcs,5),"listen error");

	int nfdcs=accept(sfdcs,(struct sockaddr*)&client_addres,&lencs);
	error_func(nfdcs,"accept error");
	char buffer[30];
	recv(nfdcs,buffer,sizeof(buffer),0);
	printf("%s\n",buffer);

	int nfd=accept(sfd,(struct sockaddr*)&client_addr,&len);
	error_func(nfd,"accept error");
	recv(nfd,buffer,sizeof(buffer),0);
	printf("%s\n",buffer);

	struct pollfd fdp[2];

	fdp[0].fd=nfd;
	fdp[0].events=POLLRDNORM;

	fdp[1].fd=nfdcs;
	fdp[1].events=POLLRDNORM;

	int clients_no=0;
	while(1)
	{
		error_func(poll(fdp,2,0),"poll error");

		if(fdp[0].events & fdp[0].revents)
		{
			printf("%s\n","0 main selected");
			int fd=recv_file_descriptor(nfd);
			printf("File descriptor%d\n",fd);
			if(clients_no >=max_clients)
			{
				//send clients to e server
				printf("%s\n","max of s reached sending to e server");
				send_file_descriptor(sfd1,fd);
				perror("send:");
			}
			else
				pthread_create(&threads[clients_no++],NULL,func,(void *)(&fd));
		}

		else if(fdp[1].events & fdp[1].revents)
		{
			printf("%s\n","1 s server selected");
			int fd=recv_file_descriptor(nfdcs);
			printf("File descriptor%d\n",fd);
			if(clients_no>=max_clients)
			{
				//send clients to e server
				printf("%s\n","max of s reached sending to e server");
				send_file_descriptor(sfd1,fd);
				perror("send:");
			}
			else
				pthread_create(&threads[clients_no++],NULL,func,(void *)(&fd));
		}
		else
			continue;
	}


}