Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2014
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <netdb.h>
  10.  
  11. #define PORT "9034" // port we're listening on
  12.  
  13. // get sockaddr, IPv4 or IPv6:
  14. void *get_in_addr(struct sockaddr *sa)
  15. {
  16. if (sa->sa_family == AF_INET) {
  17. return &(((struct sockaddr_in*)sa)->sin_addr);
  18. }
  19.  
  20. return &(((struct sockaddr_in6*)sa)->sin6_addr);
  21. }
  22.  
  23. int main(void)
  24. {
  25. fd_set master; // master file descriptor list
  26. fd_set read_fds; // temp file descriptor list for select()
  27. int fdmax; // maximum file descriptor number
  28.  
  29. int listener; // listening socket descriptor
  30. int newfd; // newly accept()ed socket descriptor
  31. struct sockaddr_storage remoteaddr; // client address
  32. socklen_t addrlen;
  33.  
  34. char buf[1024]; // buffer for client data
  35. int nbytes;
  36.  
  37. char remoteIP[INET6_ADDRSTRLEN];
  38.  
  39. int yes=1; // for setsockopt() SO_REUSEADDR, below
  40. int i, j, rv;
  41. char clientes[20][2][8];
  42.  
  43. struct addrinfo hints, *ai, *p;
  44.  
  45. FD_ZERO(&master); // clear the master and temp sets
  46. FD_ZERO(&read_fds);
  47.  
  48. // get us a socket and bind it
  49. memset(&hints, 0, sizeof hints);
  50. hints.ai_family = AF_UNSPEC;
  51. hints.ai_socktype = SOCK_STREAM;
  52. hints.ai_flags = AI_PASSIVE;
  53. if ((rv = getaddrinfo(NULL, PORT, &hints, &ai)) != 0) {
  54. fprintf(stderr, "selectserver: %s\n", gai_strerror(rv));
  55. exit(1);
  56. }
  57.  
  58. for(p = ai; p != NULL; p = p->ai_next) {
  59. listener = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
  60. if (listener < 0) {
  61. continue;
  62. }
  63.  
  64. // lose the pesky "address already in use" error message
  65. setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
  66.  
  67. if (bind(listener, p->ai_addr, p->ai_addrlen) < 0) {
  68. close(listener);
  69. continue;
  70. }
  71.  
  72. break;
  73. }
  74.  
  75. // if we got here, it means we didn't get bound
  76. if (p == NULL) {
  77. fprintf(stderr, "selectserver: failed to bind\n");
  78. exit(2);
  79. }
  80.  
  81. freeaddrinfo(ai); // all done with this
  82.  
  83. // listen
  84. if (listen(listener, 20) == -1) {
  85. perror("listen");
  86. exit(3);
  87. }
  88.  
  89. // add the listener to the master set
  90. FD_SET(listener, &master);
  91.  
  92. // keep track of the biggest file descriptor
  93. fdmax = listener; // so far, it's this one
  94.  
  95. // main loop
  96. for(;;) {
  97. read_fds = master; // copy it
  98. if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {
  99. perror("select");
  100. exit(4);
  101. }
  102.  
  103. // run through the existing connections looking for data to read
  104. for(i = 0; i <= fdmax; i++) {
  105. if (FD_ISSET(i, &read_fds)) { // we got one!!
  106. if (i == listener) {
  107. // handle new connections
  108. addrlen = sizeof remoteaddr;
  109. newfd = accept(listener,
  110. (struct sockaddr *)&remoteaddr,
  111. &addrlen);
  112.  
  113. if (newfd == -1) {
  114. perror("accept");
  115. } else {
  116. FD_SET(newfd, &master); // add to master set
  117. if (newfd > fdmax) { // keep track of the max
  118. fdmax = newfd;
  119. }
  120. //RECEBE TELA/TECLADO:
  121. if ((nbytes = recv(newfd, buf, sizeof buf, 0)) <= 0) {
  122. // got error or connection closed by client
  123. if (nbytes == 0) {
  124. // connection closed
  125. printf("selectserver: socket %d hung up\n", i); //ALTERAR ESTA MENSAGEM
  126. } else {
  127. perror("recv");
  128. }
  129. close(i); // bye!
  130. FD_CLR(i, &master); // remove from master set
  131. } else {
  132. strcpy (cliente[newfd][0], buf);
  133. printf("%s ", cliente[newfd][0]);
  134. }
  135. //recebe id
  136. if ((nbytes = recv(newfd, buf, sizeof buf, 0)) <= 0) {
  137. // got error or connection closed by client
  138. if (nbytes == 0) {
  139. // connection closed
  140. printf("selectserver: socket %d hung up\n", i); //ALTERAR ESTA MENSAGEM
  141. } else {
  142. perror("recv");
  143. }
  144. close(i); // bye!
  145. FD_CLR(i, &master); // remove from master set
  146. } else {
  147. strcpy (cliente[newfd][1], buf);
  148. printf("%s\n", cliente[newfd][1]);
  149. }
  150. printf("selectserver: new connection from %s on " //ALTERAR ESTA MENSAGEM
  151. "socket %d\n",
  152. inet_ntop(remoteaddr.ss_family,
  153. get_in_addr((struct sockaddr*)&remoteaddr),
  154. remoteIP, INET6_ADDRSTRLEN),
  155. newfd);
  156. }
  157. } else {
  158. // handle data from a client
  159. if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) {
  160. // got error or connection closed by client
  161. if (nbytes == 0) {
  162. // connection closed
  163. printf("selectserver: socket %d hung up\n", i); //ALTERAR ESTA MENSAGEM
  164. } else {
  165. perror("recv");
  166. }
  167. close(i); // bye!
  168. FD_CLR(i, &master); // remove from master set
  169. } else {
  170. printf("Teclado %d enviou uma mensagem.", i);
  171. // we got some data from a client
  172. for(j = 0; j <= fdmax; j++) {
  173. // send to everyone!
  174. if (FD_ISSET(j, &master)) {
  175. // except the listener and ourselves
  176. if (j != listener && j != i) {
  177. if (send(j, buf, nbytes, 0) == -1) {
  178. perror("send");
  179. }
  180. }
  181. }
  182. }
  183. }
  184. } // END handle data from client
  185. } // END got new incoming connection
  186. } // END looping through file descriptors
  187. } // END for(;;)--and you thought it would never end!
  188.  
  189. return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement