源码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. void start() {
  9. struct sockaddr_in my_addr;
  10. my_addr.sin_family = AF_INET;
  11. my_addr.sin_port = htons(8080);
  12. my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  13. struct sockaddr_in client_addr;
  14. char client_ip[INET_ADDRSTRLEN] = "";
  15. int clientfd = 0;
  16. int listenfd = socket(AF_INET, SOCK_STREAM, 0);
  17. bind(listenfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
  18. listen(listenfd, 128);
  19. printf("listen client @port=%d...\n", 8080);
  20. int lastfd = listenfd;
  21. int i;
  22. fd_set read_set, total_set;
  23. FD_ZERO(&read_set);
  24. FD_SET(listenfd, &total_set);
  25. while(1) {
  26. read_set = total_set;
  27. int z = select(lastfd + 1, &read_set, NULL, NULL, NULL);
  28. if (z > 0) {
  29. if (FD_ISSET(listenfd, &read_set)) {
  30. socklen_t client_len = sizeof(client_addr);
  31. clientfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_len);
  32. inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN);
  33. printf("----------------------------------\n");
  34. printf("client ip=%s, port=%d\n", client_ip, ntohs(client_addr.sin_port));
  35. FD_SET(clientfd, &total_set);
  36. lastfd = clientfd;
  37. if (0 == --z) {
  38. continue;
  39. }
  40. }
  41. for (i = listenfd + 1; i <= lastfd; i++) {
  42. if (FD_ISSET(i, &read_set)) {
  43. char recv_buf[1024] = "";
  44. int rs = read(i, recv_buf, sizeof(recv_buf));
  45. if (rs == 0) {
  46. close(i);
  47. FD_CLR(i, &total_set);
  48. } else {
  49. printf("%s\n", recv_buf);
  50. // write(0, recv_buf, rs);
  51. }
  52. }
  53. }
  54. }
  55. }
  56. }
  57. int main() {
  58. start();
  59. return 0;
  60. }

编译

  1. gcc -o select select.c

测试

  1. eric@LEGION:~/study_java$ ./select
  2. listen client @port=8080...
  3. ----------------------------------
  4. client ip=127.0.0.1, port=10966
  5. ----------------------------------
  6. client ip=127.0.0.1, port=10975
  7. 111
  8. 222