test_sock_1.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* ==== test_sock_1.c =========================================================
  2.  * Copyright (c) 1993 by Chris Provenzano, proven@athena.mit.edu
  3.  *
  4.  * Description : Test pthread_create() and pthread_exit() calls.
  5.  *
  6.  *  1.00 93/08/03 proven
  7.  *      -Started coding this file.
  8.  */
  9. #include <pthread.h>
  10. #include <errno.h>
  11. #include <stdio.h>
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <netinet/in.h>
  15. struct sockaddr_in a_sout;
  16. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  17. pthread_attr_t attr;
  18. #define MESSAGE5 "This should be message #5"
  19. #define MESSAGE6 "This should be message #6"
  20. void * sock_connect(void* arg)
  21. {
  22. char buf[1024];
  23. int fd, tmp;
  24. /* Ensure sock_read runs first */
  25. if (pthread_mutex_lock(&mutex)) {
  26. printf("Error: sock_connect:pthread_mutex_lock()n");
  27. exit(1);
  28. }
  29. a_sout.sin_addr.s_addr = htonl(0x7f000001); /* loopback */
  30. if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  31. printf("Error: sock_connect:socket()n");
  32. exit(1);
  33. }
  34. printf("This should be message #2n");
  35. if (connect(fd, (struct sockaddr *) &a_sout, sizeof(a_sout)) < 0) {
  36. printf("Error: sock_connect:connect()n");
  37. exit(1);
  38. }
  39. close(fd);
  40. if (pthread_mutex_unlock(&mutex)) {
  41. printf("Error: sock_connect:pthread_mutex_lock()n");
  42. exit(1);
  43. }
  44. if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  45. printf("Error: sock_connect:socket()n");
  46. exit(1);
  47. }
  48. printf("This should be message #3n");
  49. if (connect(fd, (struct sockaddr *) &a_sout, sizeof(a_sout)) < 0) {
  50. printf("Error: sock_connect:connect()n");
  51. exit(1);
  52. }
  53. /* Ensure sock_read runs again */
  54. pthread_yield();
  55. pthread_yield();
  56. pthread_yield();
  57. pthread_yield();
  58. if (pthread_mutex_lock(&mutex)) {
  59. printf("Error: sock_connect:pthread_mutex_lock()n");
  60. exit(1);
  61. }
  62. if ((tmp = read(fd, buf, 1024)) <= 0) {
  63. printf("Error: sock_connect:read() == %dn", tmp);
  64. exit(1);
  65. }
  66. write(fd, MESSAGE6, sizeof(MESSAGE6));
  67. printf("%sn", buf);
  68. close(fd);
  69. }
  70. extern struct fd_table_entry ** fd_table;
  71. void * sock_write(void* arg)
  72. {
  73. int fd = *(int *)arg;
  74. write(fd, MESSAGE5, sizeof(MESSAGE5));
  75. return(NULL);
  76. }
  77. void * sock_accept(void* arg)
  78. {
  79. pthread_t thread;
  80. struct sockaddr a_sin;
  81. int a_sin_size, a_fd, fd, tmp;
  82. short port;
  83. char buf[1024];
  84. if (pthread_mutex_unlock(&mutex)) {
  85. printf("Error: sock_accept:pthread_mutex_lock()n");
  86. exit(1);
  87. }
  88. port = 3276;
  89. a_sout.sin_family = AF_INET;
  90. a_sout.sin_port = htons(port);
  91. a_sout.sin_addr.s_addr = INADDR_ANY;
  92. if ((a_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  93. printf("Error: sock_accept:socket()n");
  94. exit(1);
  95. }
  96. while (bind(a_fd, (struct sockaddr *) &a_sout, sizeof(a_sout)) < 0) {
  97. if (errno == EADDRINUSE) { 
  98. a_sout.sin_port = htons((++port));
  99. continue;
  100. }
  101. printf("Error: sock_accept:bind()n");
  102. exit(1);
  103. }
  104. if (listen(a_fd, 2)) {
  105. printf("Error: sock_accept:listen()n");
  106. exit(1);
  107. }
  108. a_sin_size = sizeof(a_sin);
  109. printf("This should be message #1n");
  110. if ((fd = accept(a_fd, &a_sin, &a_sin_size)) < 0) {
  111. printf("Error: sock_accept:accept()n");
  112. exit(1);
  113. }
  114. if (pthread_mutex_lock(&mutex)) {
  115. printf("Error: sock_accept:pthread_mutex_lock()n");
  116. exit(1);
  117. }
  118. close(fd);
  119. a_sin_size = sizeof(a_sin);
  120. printf("This should be message #4n");
  121. if ((fd = accept(a_fd, &a_sin, &a_sin_size)) < 0) {
  122. printf("Error: sock_accept:accept()n");
  123. exit(1);
  124. }
  125. if (pthread_mutex_unlock(&mutex)) {
  126. printf("Error: sock_accept:pthread_mutex_lock()n");
  127. exit(1);
  128. }
  129. /* Setup a write thread */
  130. if (pthread_create(&thread, &attr, sock_write, &fd)) {
  131. printf("Error: sock_accept:pthread_create(sock_write)n");
  132. exit(1);
  133. }
  134. if ((tmp = read(fd, buf, 1024)) <= 0) {
  135. printf("Error: sock_accept:read() == %dn", tmp);
  136. exit(1);
  137. }
  138. printf("%sn", buf);
  139. close(fd);
  140. }
  141. main()
  142. {
  143. pthread_t thread;
  144. int i;
  145. pthread_init(); 
  146. setbuf(stdout, NULL);
  147. setbuf(stderr, NULL);
  148. /* Ensure sock_read runs first */
  149. if (pthread_mutex_lock(&mutex)) {
  150. printf("Error: main:pthread_mutex_lock()n");
  151. exit(1);
  152. }
  153. if (pthread_attr_init(&attr)) {
  154. printf("Error: main:pthread_attr_init()n");
  155. exit(1);
  156. }
  157. if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO)) {
  158. printf("Error: main:pthread_attr_setschedpolicy()n");
  159. exit(1);
  160. }
  161. if (pthread_create(&thread, &attr, sock_accept, (void *)0xdeadbeaf)) {
  162. printf("Error: main:pthread_create(sock_accept)n");
  163. exit(1);
  164. }
  165. if (pthread_create(&thread, &attr, sock_connect, (void *)0xdeadbeaf)) {
  166. printf("Error: main:pthread_create(sock_connect)n");
  167. exit(1);
  168. }
  169. printf("initial thread %lx going to sleepn", pthread_self());
  170. sleep(10);
  171. printf("done sleepingn");
  172. return 0;
  173. }