Advertisement
Guest User

Descriptor receiver

a guest
Mar 8th, 2015
447
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <sys/socket.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <errno.h>
  8. #include <string.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <sys/un.h>
  12. #include <pthread.h>
  13. using namespace std;
  14. #define SOCK_PATH "server"
  15.  
  16. static int recv_file_descriptor(int socket){
  17. int sent_fd;
  18. struct msghdr message;
  19. struct iovec iov[1];
  20. struct cmsghdr *control_message = NULL;
  21. char ctrl_buf[CMSG_SPACE(sizeof(int))];
  22. char data[1];
  23. int res;
  24.  
  25. memset(&message, 0, sizeof(struct msghdr));
  26. memset(ctrl_buf, 0, CMSG_SPACE(sizeof(int)));
  27.  
  28. /* For the dummy data */
  29. iov[0].iov_base = data;
  30. iov[0].iov_len = sizeof(data);
  31.  
  32. message.msg_name = NULL;
  33. message.msg_namelen = 0;
  34. message.msg_control = ctrl_buf;
  35. message.msg_controllen = CMSG_SPACE(sizeof(int));
  36. message.msg_iov = iov;
  37. message.msg_iovlen = 1;
  38.  
  39. if((res = recvmsg(socket, &message, 0)) <= 0)
  40. { perror("recvmsg");
  41. return res;}
  42.  
  43. /* Iterate through header to find if there is a file descriptor */
  44. for(control_message = CMSG_FIRSTHDR(&message);
  45. control_message != NULL;
  46. control_message = CMSG_NXTHDR(&message,
  47. control_message))
  48. {
  49. if( (control_message->cmsg_level == SOL_SOCKET) &&
  50. (control_message->cmsg_type == SCM_RIGHTS) )
  51. {
  52. return *((int *) CMSG_DATA(control_message));
  53. }
  54. }
  55.  
  56. return -1;
  57. }
  58.  
  59. int usfd;
  60. static int recvfd(int socket){
  61. struct msghdr msg = {0};
  62.  
  63. char m_buffer[256];
  64. struct iovec io = { .iov_base = m_buffer, .iov_len = sizeof(m_buffer) };
  65. msg.msg_iov = &io;
  66. msg.msg_iovlen = 1;
  67.  
  68. char c_buffer[256];
  69. msg.msg_control = c_buffer;
  70. msg.msg_controllen = sizeof(c_buffer);
  71.  
  72. if (recvmsg(socket, &msg, 0) < 0)
  73. printf("Failed to receive message\n");
  74.  
  75. struct cmsghdr * cmsg = CMSG_FIRSTHDR(&msg);
  76.  
  77. unsigned char * data = CMSG_DATA(cmsg);
  78.  
  79. printf("About to extract fd\n");
  80. int fd = *((int*) data);
  81. printf("Extracted fd %d\n", fd);
  82.  
  83. return fd;
  84. }
  85. static int recvfd2(int socket){
  86. struct msghdr msg = {0};
  87.  
  88. /* On Mac OS X, the struct iovec is needed, even if it points to minimal data */
  89. char m_buffer[1];
  90. struct iovec io = { .iov_base = m_buffer, .iov_len = sizeof(m_buffer) };
  91. msg.msg_iov = &io;
  92. msg.msg_iovlen = 1;
  93.  
  94. char c_buffer[256];
  95. msg.msg_control = c_buffer;
  96. msg.msg_controllen = sizeof(c_buffer);
  97.  
  98. if (recvmsg(socket, &msg, 0) < 0)
  99. printf("Failed to receive message\n");
  100.  
  101. struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
  102.  
  103. printf("About to extract fd\n");
  104. int fd;
  105. memmove(&fd, CMSG_DATA(cmsg), sizeof(fd));
  106. printf("Extracted fd %d\n", fd);
  107.  
  108. return fd;
  109. }
  110. int main(){
  111. char buf[100];
  112. int len;
  113. struct sockaddr_un server;
  114. pthread_t thread;
  115. server.sun_family=AF_LOCAL;
  116. strcpy(server.sun_path,SOCK_PATH);
  117. len=strlen(server.sun_path)+sizeof(server.sun_family);
  118. usfd=socket(AF_LOCAL,SOCK_STREAM,0);
  119. connect(usfd,(struct sockaddr *)&server,len);
  120. perror("connect");
  121. char msg[50];
  122. strcpy(msg,"this is service 1 : \n");
  123. cout<<msg;
  124. while(1){
  125. char msg[50];
  126. int fd;
  127. fd_set fds,master;
  128. FD_ZERO(&fds);
  129. FD_SET(usfd,&fds);
  130. master = fds;
  131. int nsfd[100];
  132. int current=1,i,k;
  133. nsfd[0]=3;
  134. dup2(0,nsfd[0]);
  135. while(1){
  136. cout<<"checking\n";
  137. fds = master;
  138. select(FD_SETSIZE,&fds,NULL,NULL,NULL);
  139. for(i=0;i<current;i++){
  140. if(FD_ISSET(nsfd[i],&fds)){
  141. k = recv(nsfd[i],msg,50,0);
  142. if(k<0||k==0){
  143. FD_CLR(nsfd[i],&master);
  144. }
  145. else{
  146. sprintf(msg,"%d\n\0",k);
  147. send(nsfd[i],msg,strlen(msg),0);
  148. }
  149. }
  150. }
  151. if(FD_ISSET(usfd,&fds)){
  152. nsfd[current] = recvfd2(usfd);
  153. FD_SET(nsfd[current],&master);
  154. cout<<"recv"<<nsfd[current]<<"\n";
  155. current++;
  156. }
  157. }
  158. }
  159. return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement