Advertisement
Guest User

main server

a guest
Mar 8th, 2015
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <sys/socket.h>
  3. #include <arpa/inet.h>
  4. #include <unistd.h>
  5. #include <signal.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <errno.h>
  11. #include <string.h>
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <sys/un.h>
  15. #include <fcntl.h>
  16. #include <sys/select.h>
  17. #include <sys/time.h>
  18. #include <sys/types.h>
  19.  
  20. using namespace std;
  21.  
  22. #define MAX_SERVICE 1
  23. #define SOCK_PATH "server"
  24.  
  25. int nsfd[100];
  26.  
  27. void init(bool arr[]){
  28. for(int i=0;i<MAX_SERVICE;i++)
  29. arr[i]=false;
  30. }
  31. int sendfd(int sock, int fd)
  32. {
  33. struct msghdr hdr;
  34. struct iovec data;
  35.  
  36. char cmsgbuf[CMSG_SPACE(sizeof(int))];
  37.  
  38. char dummy = '*';
  39. data.iov_base = &dummy;
  40. data.iov_len = sizeof(dummy);
  41.  
  42. memset(&hdr, 0, sizeof(hdr));
  43. hdr.msg_name = NULL;
  44. hdr.msg_namelen = 0;
  45. hdr.msg_iov = &data;
  46. hdr.msg_iovlen = 1;
  47. hdr.msg_flags = 0;
  48.  
  49. hdr.msg_control = cmsgbuf;
  50. hdr.msg_controllen = CMSG_LEN(sizeof(int));
  51.  
  52. struct cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr);
  53. cmsg->cmsg_len = CMSG_LEN(sizeof(int));
  54. cmsg->cmsg_level = SOL_SOCKET;
  55. cmsg->cmsg_type = SCM_RIGHTS;
  56.  
  57. *(int*)CMSG_DATA(cmsg) = fd;
  58.  
  59. int n = sendmsg(sock, &hdr, 0);
  60.  
  61. if(n == -1)
  62. printf("sendmsg() failed: %s (socket fd = %d)\n", strerror(errno), sock);
  63.  
  64. return n;
  65. }
  66. static int send_file_descriptor(int socket, int fd_to_send) {
  67. struct msghdr message;
  68. struct iovec iov[1];
  69. struct cmsghdr *control_message = NULL;
  70. char ctrl_buf[CMSG_SPACE(sizeof(int))];
  71. char data[1];
  72.  
  73. memset(&message, 0, sizeof(struct msghdr));
  74. memset(ctrl_buf, 0, CMSG_SPACE(sizeof(int)));
  75.  
  76. /* We are passing at least one byte of data so that recvmsg() will not return 0 */
  77. data[0] = ' ';
  78. iov[0].iov_base = data;
  79. iov[0].iov_len = sizeof(data);
  80.  
  81. message.msg_name = NULL;
  82. message.msg_namelen = 0;
  83. message.msg_iov = iov;
  84. message.msg_iovlen = 1;
  85. message.msg_controllen = CMSG_SPACE(sizeof(int));
  86. message.msg_control = ctrl_buf;
  87.  
  88. control_message = CMSG_FIRSTHDR(&message);
  89. control_message->cmsg_level = SOL_SOCKET;
  90. control_message->cmsg_type = SCM_RIGHTS;
  91. control_message->cmsg_len = CMSG_LEN(sizeof(int));
  92.  
  93. *((int *) CMSG_DATA(control_message)) = fd_to_send;
  94.  
  95. sendmsg(socket, &message, 0);
  96. perror("sendmsg");
  97. return 1;
  98. }
  99. int sendfd2(int socket, int fd){
  100. struct msghdr msg = { 0 };
  101. char buf[CMSG_SPACE(sizeof(fd))];
  102. memset(buf, '\0', sizeof(buf));
  103.  
  104. /* On Mac OS X, the struct iovec is needed, even if it points to minimal data */
  105. struct iovec io;
  106. io.iov_base = (void*)("");
  107. io.iov_len = 1;
  108.  
  109. msg.msg_iov = &io;
  110. msg.msg_iovlen = 1;
  111. msg.msg_control = buf;
  112. msg.msg_controllen = sizeof(buf);
  113.  
  114. struct cmsghdr * cmsg = CMSG_FIRSTHDR(&msg);
  115. cmsg->cmsg_level = SOL_SOCKET;
  116. cmsg->cmsg_type = SCM_RIGHTS;
  117. cmsg->cmsg_len = CMSG_LEN(sizeof(fd));
  118.  
  119. memmove(CMSG_DATA(cmsg), &fd, sizeof(fd));
  120.  
  121. msg.msg_controllen = cmsg->cmsg_len;
  122.  
  123. if (sendmsg(socket, &msg, 0) < 0)
  124. printf("Failed to send message\n");
  125. }
  126. int make(int i){
  127. int c=fork();
  128. if(c==0){
  129. dup2(nsfd[i],0);
  130. execlp("./s1","s1",NULL);
  131. }
  132. else return 0;
  133. }
  134.  
  135. int main(){
  136. unlink(SOCK_PATH);
  137. bool service[MAX_SERVICE];
  138. char buf[50];
  139. int sfd,len,ulen;
  140. int ucfd[MAX_SERVICE];
  141. int usfd;
  142.  
  143. init(service);
  144.  
  145. sockaddr_in server,client;
  146. sockaddr_un usvr,uclr;
  147.  
  148. len=sizeof(server);
  149.  
  150. //sfd inital-----------------------
  151. server.sin_family=AF_INET;
  152. server.sin_port=htons(8888);
  153. server.sin_addr.s_addr=INADDR_ANY;
  154.  
  155.  
  156. //usfd inital------------------------------
  157. usvr.sun_family=AF_UNIX;
  158. strcpy(usvr.sun_path,SOCK_PATH);
  159. ulen=strlen(usvr.sun_path)+sizeof(usvr.sun_family);
  160.  
  161.  
  162. //sfd---------------------
  163. sfd=socket(AF_INET,SOCK_STREAM,0);
  164. bind(sfd,(struct sockaddr *)&server,sizeof(server));
  165. perror("bind");
  166.  
  167. listen(sfd,3);
  168.  
  169.  
  170. //usfd-------------------------
  171. usfd=socket(AF_UNIX,SOCK_STREAM,0);
  172. bind(usfd,(struct sockaddr *)&usvr,ulen);
  173. perror("unixBind");
  174.  
  175. listen(usfd,5);
  176.  
  177.  
  178. char mkv[100];
  179. strcpy(mkv,"yoyo for the client to announce the type of service : \n");
  180. fd_set fds,master;
  181. FD_ZERO(&fds);
  182. FD_SET(sfd,&fds);
  183. FD_SET(usfd,&fds);
  184. master = fds;
  185. int current=0,i,k;
  186.  
  187.  
  188. while(1){
  189. fds = master;
  190. k = select(FD_SETSIZE,&fds,NULL,NULL,NULL);
  191. if(FD_ISSET(sfd,&fds)){
  192. nsfd[current++] =accept(sfd,(struct sockaddr * )&client,(socklen_t *)&len);
  193. FD_SET(nsfd[current-1],&master);
  194. perror("accept");
  195. }
  196. for(i=0;i<current;i++){
  197. if(FD_ISSET(nsfd[i],&fds)){
  198. k = recv(nsfd[i],buf,100,0);
  199. if(k<0||k==0){
  200. FD_CLR(nsfd[i],&master);
  201. }
  202. else{
  203. k = atoi(buf);
  204. k--;
  205. if(k >= 0 && k < MAX_SERVICE ){
  206. if(service[k]==false){
  207. make(i);
  208. ucfd[0]=accept(usfd,(struct sockaddr *)&uclr,(socklen_t *)&ulen);
  209. perror("unix accept");
  210. service[0]=true;
  211. }
  212. else{
  213. sendfd2(ucfd[0],nsfd[i]);
  214. }
  215. }
  216. }
  217. }
  218. }
  219. }
  220. return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement