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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Higher level user subroutines built on top of the socket primitives
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include <stdarg.h>
  6. #include <errno.h>
  7. #include "mbuf.h"
  8. #include "proc.h"
  9. #include "socket.h"
  10. #include "usock.h"
  11. #include "session.h"
  12. #include "nr4.h"
  13. /* Higher-level receive routine, intended for connection-oriented sockets.
  14.  * Can be used with datagram sockets, although the sender id is lost.
  15.  */
  16. int
  17. recv(s,buf,len,flags)
  18. int s; /* Socket index */
  19. void *buf; /* User buffer */
  20. int len; /* Max length to receive */
  21. int flags; /* Unused; will eventually select oob data, etc */
  22. {
  23. struct mbuf *bp;
  24. int cnt;
  25. if(len == 0)
  26. return 0; /* Otherwise would be interp as "all" */
  27. cnt = recv_mbuf(s,&bp,flags,NULL,(int *)NULL);
  28. if(cnt > 0){
  29. cnt = min(cnt,len);
  30. pullup(&bp,buf,(uint16)cnt);
  31. free_p(&bp);
  32. }
  33. return cnt;
  34. }
  35. /* Higher level receive routine, intended for datagram sockets. Can also
  36.  * be used for connection-oriented sockets, although from and fromlen are
  37.  * ignored.
  38.  */
  39. int
  40. recvfrom(s,buf,len,flags,from,fromlen)
  41. int s; /* Socket index */
  42. void *buf; /* User buffer */
  43. int len; /* Maximum length */
  44. int flags; /* Unused; will eventually select oob data, etc */
  45. struct sockaddr *from; /* Source address, only for datagrams */
  46. int *fromlen; /* Length of source address */
  47. {
  48. struct mbuf *bp;
  49. register int cnt;
  50. cnt = recv_mbuf(s,&bp,flags,from,fromlen);
  51. if(cnt > 0){
  52. cnt = min(cnt,len);
  53. pullup(&bp,buf,(uint16)cnt);
  54. free_p(&bp);
  55. }
  56. return cnt;
  57. }
  58. /* High level send routine */
  59. int
  60. send(s,buf,len,flags)
  61. int s; /* Socket index */
  62. void *buf; /* User buffer */
  63. int len; /* Length of buffer */
  64. int flags; /* Unused; will eventually select oob data, etc */
  65. {
  66. struct mbuf *bp;
  67. struct sockaddr sock;
  68. int i = MAXSOCKSIZE;
  69. if(getpeername(s,&sock,&i) == -1)
  70. return -1;
  71. bp = qdata(buf,(uint16)len);
  72. return send_mbuf(s,&bp,flags,&sock,i);
  73. }
  74. /* High level send routine, intended for datagram sockets. Can be used on
  75.  * connection-oriented sockets, but "to" and "tolen" are ignored.
  76.  */
  77. int
  78. sendto(
  79. int s, /* Socket index */
  80. void *buf, /* User buffer */
  81. int len, /* Length of buffer */
  82. int flags, /* Unused; will eventually select oob data, etc */
  83. struct sockaddr *to, /* Destination, only for datagrams */
  84. int tolen /* Length of destination */
  85. ){
  86. struct mbuf *bp;
  87. bp = qdata(buf,(uint16)len);
  88. return send_mbuf(s,&bp,flags,to,tolen);
  89. }