qlen.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "unpxti.h"
  2. #define PORT 9999
  3. #define ADDR "127.0.0.1"
  4. #define MAXBACKLOG 100
  5. /* globals */
  6. struct sockaddr_in serv;
  7. pid_t pid; /* of child */
  8. int pipefd[2];
  9. #define pfd pipefd[1] /* parent's end */
  10. #define cfd pipefd[0] /* child's end */
  11. /* function prototypes */
  12. void do_parent(void);
  13. void do_child(void);
  14. int
  15. main(int argc, char **argv)
  16. {
  17. if (argc != 1)
  18. err_quit("usage: qlen");
  19. Socketpair(AF_UNIX, SOCK_STREAM, 0, pipefd);
  20. bzero(&serv, sizeof(serv));
  21. serv.sin_family = AF_INET;
  22. serv.sin_port = htons(PORT);
  23. Inet_pton(AF_INET, ADDR, &serv.sin_addr);
  24. if ( (pid = Fork()) == 0)
  25. do_child();
  26. else
  27. do_parent();
  28. exit(0);
  29. }
  30. void
  31. parent_alrm(int signo)
  32. {
  33. return; /* just interrupt blocked connect() */
  34. }
  35. /* include qlen */
  36. void
  37. do_parent(void)
  38. {
  39. int qlen, j, k, junk, fd[MAXBACKLOG + 1];
  40. struct t_call tcall;
  41. Close(cfd);
  42. Signal(SIGALRM, parent_alrm);
  43. for (qlen = 0; qlen <= 14; qlen++) {
  44. printf("qlen = %d: ", qlen);
  45. Write(pfd, &qlen, sizeof(int)); /* tell child value */
  46. Read(pfd, &junk, sizeof(int)); /* wait for child */
  47. for (j = 0; j <= MAXBACKLOG; j++) {
  48. fd[j] = T_open(XTI_TCP, O_RDWR, NULL);
  49. T_bind(fd[j], NULL, NULL);
  50. tcall.addr.maxlen = sizeof(serv);
  51. tcall.addr.len = sizeof(serv);
  52. tcall.addr.buf = &serv;
  53. tcall.opt.len = 0;
  54. tcall.udata.len = 0;
  55. alarm(2);
  56. if (t_connect(fd[j], &tcall, NULL) < 0) {
  57. if (errno != EINTR)
  58. err_xti("t_connect error, j = %d", j);
  59. printf("timeout, %d connections completed\n", j-1);
  60. for (k = 1; k < j; k++)
  61. T_close(fd[k]);
  62. break; /* next value of qlen */
  63. }
  64. alarm(0);
  65. }
  66. if (j > MAXBACKLOG)
  67. printf("%d connections?\n", MAXBACKLOG);
  68. }
  69. qlen = -1; /* tell child we're all done */
  70. Write(pfd, &qlen, sizeof(int));
  71. }
  72. void
  73. do_child(void)
  74. {
  75. int listenfd, qlen, junk;
  76. struct t_bind tbind, tbindret;
  77. Close(pipefd[1]);
  78. Read(cfd, &qlen, sizeof(int)); /* wait for parent */
  79. while (qlen >= 0) {
  80. listenfd = T_open(XTI_TCP, O_RDWR, NULL);
  81. tbind.addr.maxlen = sizeof(serv);
  82. tbind.addr.len = sizeof(serv);
  83. tbind.addr.buf = &serv;
  84. tbind.qlen = qlen;
  85. tbindret.addr.maxlen = 0;
  86. tbindret.addr.len = 0;
  87. T_bind(listenfd, &tbind, &tbindret);
  88. printf("returned qlen = %d, ", tbindret.qlen);
  89. fflush(stdout);
  90. Write(cfd, &junk, sizeof(int)); /* tell parent */
  91. Read(cfd, &qlen, sizeof(int)); /* just wait for parent */
  92. T_close(listenfd); /* closes all queued connections too */
  93. }
  94. }
  95. /* end qlen */