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; }
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); }
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)); } }
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); }
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); } }
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; }
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; } }