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)); } }
static int do_client(void) { int sockfd; sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); exit(EXIT_FAILURE); } struct sockaddr_un saddr = {0}; saddr.sun_family = AF_UNIX; strcpy(saddr.sun_path, UNIX_DOMAIN_PATH); if (connect(sockfd, (struct sockaddr*) &saddr, sizeof(struct sockaddr_un)) == -1) { perror("connect"); goto error; } setnonblocking(sockfd); int shmfd; while ((shmfd = recv_file_descriptor(sockfd)) == -1) { if (errno != EAGAIN) { perror("recv_file_descriptor"); exit(EXIT_FAILURE); } } close(sockfd); return shmfd; error: close(sockfd); exit(EXIT_FAILURE); return -1; }
int get_magic_socket(char* host, char* port) { struct sockaddr_un addr; int fd; printf("Get socket to %s:%s\n", host, port); if ((fd = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) { perror("Failed to create client socket"); return fd; } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_LOCAL; strcpy(addr.sun_path, SOCKET_PATH); if (connect(fd, (struct sockaddr *) &(addr), sizeof(addr)) < 0) { perror("Failed to connect to server\n"); return -1; } char target[1024]; sprintf(target, "%s:%s", host, port); if (send(fd, target, strlen(target), 0) < 0) { fprintf(stderr, "Error sending target '%s' to server: %s", target, strerror(errno)); return -2; } int magic_sock = recv_file_descriptor(fd); return magic_sock; }
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() { 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; } }