locsock.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. #include <errno.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "socket.h"
  5. #include "usock.h"
  6. int
  7. so_los(struct usock *up,int protocol)
  8. {
  9. up->cb.local = (struct loc *) callocw(1,sizeof(struct loc));
  10. up->cb.local->peer = up; /* connect to self */
  11. up->type = TYPE_LOCAL_STREAM;
  12. up->cb.local->hiwat = LOCSFLOW;
  13. return 0;
  14. }
  15. int
  16. so_lod(struct usock *up,int protocol)
  17. {
  18. up->cb.local = (struct loc *) callocw(1,sizeof(struct loc));
  19. up->cb.local->peer = up; /* connect to self */
  20. up->type = TYPE_LOCAL_DGRAM;
  21. up->cb.local->hiwat = LOCDFLOW;
  22. return 0;
  23. }
  24. int
  25. so_lo_recv(
  26. struct usock *up,
  27. struct mbuf **bpp,
  28. struct sockaddr *from,
  29. int *fromlen
  30. ){
  31. int s;
  32. while(up->cb.local != NULL && up->cb.local->q == NULL
  33.   && up->cb.local->peer != NULL){
  34. if(up->noblock){
  35. errno = EWOULDBLOCK;
  36. return -1;
  37. } else if((errno = kwait(up)) != 0){
  38. return -1;
  39. }
  40. }
  41. if(up->cb.local == NULL){
  42. /* Socket went away */
  43. errno = EBADF;
  44. return -1;
  45. }
  46. if(up->cb.local->q == NULL &&
  47.    up->cb.local->peer == NULL){
  48. errno = ENOTCONN;
  49. return -1;
  50. }
  51. /* For datagram sockets, this will return the
  52.  * first packet on the queue. For stream sockets,
  53.  * this will return everything.
  54.  */
  55. *bpp = dequeue(&up->cb.local->q);
  56. if(up->cb.local->q == NULL && (up->cb.local->flags & LOC_SHUTDOWN)){
  57. s = up->index;
  58. close_s(s);
  59. }
  60. ksignal(up,0);
  61. return len_p(*bpp);
  62. }
  63. int
  64. so_los_send(
  65. struct usock *up,
  66. struct mbuf **bpp,
  67. struct sockaddr *to
  68. ){
  69. if(up->cb.local->peer == NULL){
  70. free_p(bpp);
  71. errno = ENOTCONN;
  72. return -1;
  73. }
  74. append(&up->cb.local->peer->cb.local->q,bpp);
  75. ksignal(up->cb.local->peer,0);
  76. /* If high water mark has been reached, block */
  77. while(up->cb.local->peer != NULL &&
  78.       len_p(up->cb.local->peer->cb.local->q) >=
  79.       up->cb.local->peer->cb.local->hiwat){
  80. if(up->noblock){
  81. errno = EWOULDBLOCK;
  82. return -1;
  83. } else if((errno = kwait(up->cb.local->peer)) != 0){
  84. return -1;
  85. }
  86. }
  87. if(up->cb.local->peer == NULL){
  88. errno = ENOTCONN;
  89. return -1;
  90. }
  91. return 0;
  92. }
  93. int
  94. so_lod_send(
  95. struct usock *up,
  96. struct mbuf **bpp,
  97. struct sockaddr *to
  98. ){
  99. if(up->cb.local->peer == NULL){
  100. free_p(bpp);
  101. errno = ENOTCONN;
  102. return -1;
  103. }
  104. enqueue(&up->cb.local->peer->cb.local->q,bpp);
  105. ksignal(up->cb.local->peer,0);
  106. /* If high water mark has been reached, block */
  107. while(up->cb.local->peer != NULL &&
  108.       len_q(up->cb.local->peer->cb.local->q) >=
  109.       up->cb.local->peer->cb.local->hiwat){
  110. if(up->noblock){
  111. errno = EWOULDBLOCK;
  112. return -1;
  113. } else if((errno = kwait(up->cb.local->peer)) != 0){
  114. return -1;
  115. }
  116. }
  117. if(up->cb.local->peer == NULL){
  118. errno = ENOTCONN;
  119. return -1;
  120. }
  121. return 0;
  122. }
  123. int
  124. so_lod_qlen(struct usock *up,int rtx)
  125. {
  126. int len;
  127. switch(rtx){
  128. case 0:
  129. len = len_q(up->cb.local->q);
  130. break;
  131. case 1:
  132. if(up->cb.local->peer != NULL)
  133. len = len_q(up->cb.local->peer->cb.local->q);
  134. break;
  135. }
  136. return len;
  137. }
  138. int
  139. so_los_qlen(struct usock *up,int rtx)
  140. {
  141. int len;
  142. switch(rtx){
  143. case 0:
  144. len = len_p(up->cb.local->q);
  145. break;
  146. case 1:
  147. if(up->cb.local->peer != NULL)
  148. len = len_p(up->cb.local->peer->cb.local->q);
  149. break;
  150. }
  151. return len;
  152. }
  153. int
  154. so_loc_shut(struct usock *up,int how)
  155. {
  156. int s;
  157. s = up->index;
  158. if(up->cb.local->q == NULL)
  159. close_s(s);
  160. else
  161. up->cb.local->flags = LOC_SHUTDOWN;
  162. return 0;
  163. }
  164. int
  165. so_loc_close(struct usock *up)
  166. {
  167. if(up->cb.local->peer != NULL){
  168. up->cb.local->peer->cb.local->peer = NULL;
  169. ksignal(up->cb.local->peer,0);
  170. }
  171. free_q(&up->cb.local->q);
  172. free(up->cb.local);
  173. return 0;
  174. }
  175. char *
  176. lopsocket(struct sockaddr *p)
  177. {
  178. return "";
  179. }
  180. so_loc_stat(struct usock *up)
  181. {
  182. int s;
  183. s = up->index;
  184. printf("Inqlen: %d packetsn",socklen(s,0));
  185. printf("Outqlen: %d packetsn",socklen(s,1));
  186. return 0;
  187. }