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

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. #define MESSAGE5 "This should be message #5"
  17. #define MESSAGE6 "This should be message #6"
  18. void * sock_write(void* arg)
  19. {
  20. int fd = *(int *)arg;
  21. write(fd, MESSAGE5, sizeof(MESSAGE5));
  22. return(NULL);
  23. }
  24. void * sock_accept(void* arg)
  25. {
  26. pthread_t thread;
  27. struct sockaddr a_sin;
  28. int a_sin_size, a_fd, fd, tmp;
  29. short port;
  30. char buf[1024];
  31. port = 3276;
  32. a_sout.sin_family = AF_INET;
  33. a_sout.sin_port = htons(port);
  34. a_sout.sin_addr.s_addr = INADDR_ANY;
  35. if ((a_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  36. printf("Error: sock_accept:socket()n");
  37. exit(1);
  38. }
  39. while (bind(a_fd, (struct sockaddr *) &a_sout, sizeof(a_sout)) < 0) {
  40. if (errno == EADDRINUSE) { 
  41. a_sout.sin_port = htons((++port));
  42. continue;
  43. }
  44. printf("Error: sock_accept:bind()n");
  45. exit(1);
  46. }
  47. if (listen(a_fd, 2)) {
  48. printf("Error: sock_accept:listen()n");
  49. exit(1);
  50. }
  51. a_sin_size = sizeof(a_sin);
  52. printf("This should be message #1n");
  53. if ((fd = accept(a_fd, &a_sin, &a_sin_size)) < 0) {
  54. printf("Error: sock_accept:accept()n");
  55. exit(1);
  56. }
  57. close(fd); 
  58. sleep(1);
  59. a_sin_size = sizeof(a_sin);
  60. memset(&a_sin, 0, sizeof(a_sin));
  61. printf("This should be message #4n");
  62. if ((fd = accept(a_fd, &a_sin, &a_sin_size)) < 0) {
  63. printf("Error: sock_accept:accept()n");
  64. exit(1);
  65. }
  66. /* Setup a write thread */
  67. if (pthread_create(&thread, NULL, sock_write, &fd)) {
  68. printf("Error: sock_accept:pthread_create(sock_write)n");
  69. exit(1);
  70. }
  71. if ((tmp = read(fd, buf, 1024)) <= 0) {
  72. tmp = read(fd, buf, 1024);
  73. printf("Error: sock_accept:read() == %dn", tmp);
  74. exit(1);
  75. }
  76. printf("%sn", buf);
  77. close(fd);
  78. }
  79. main()
  80. {
  81. pthread_t thread;
  82. int i;
  83. switch(fork()) {
  84. case -1:
  85. printf("Error: main:fork()n");
  86. break;
  87. case 0:
  88. execl("test_sock_2a", "test_sock_2a", "fork okay", NULL);
  89. default:
  90. break;
  91. }
  92. setbuf(stdout, NULL);
  93. setbuf(stderr, NULL);
  94. if (pthread_create(&thread, NULL, sock_accept, (void *)0xdeadbeaf)) {
  95. printf("Error: main:pthread_create(sock_accept)n");
  96. exit(1);
  97. }
  98. pthread_exit(NULL);
  99. }