net.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*-
  2.  * Copyright (c) 1993-1994, 1998 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *      This product includes software developed by the University of
  16.  *      California, Berkeley and the Network Research Group at
  17.  *      Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. #ifndef lint
  35. static const char rcsid[] =
  36.     "@(#) $Header: /cvsroot/nsnam/ns-2/emulate/net.cc,v 1.8 2005/01/25 23:29:12 haldar Exp $ (LBL)";
  37. #endif
  38. #include <stdlib.h>
  39. #include <math.h>
  40. #ifndef WIN32
  41. #include <unistd.h>
  42. #endif
  43. #include <stdio.h>
  44. #include <stdlib.h>
  45. #include <fcntl.h>
  46. #include <errno.h>
  47. #include <string.h>
  48. #ifdef WIN32
  49. #include <windows.h>
  50. #include <winsock.h>
  51. #else
  52. #include <sys/socket.h>
  53. #include <sys/uio.h>
  54. #include <sys/time.h>
  55. #endif
  56. #include "net.h"
  57. /*
  58.  * Linux does not have sendmsg
  59.  */
  60. #if defined(__linux__) || defined(WIN32)
  61. #define MAXPACKETSIZE (1500-28)
  62. /*static int
  63. sendmsg(int s, struct msghdr* mh, int flags)
  64. {
  65. u_char wrkbuf[MAXPACKETSIZE];
  66. int len = mh->msg_iovlen;
  67. struct iovec* iov = mh->msg_iov;
  68. u_char* cp;
  69. u_char* ep;
  70. for (cp = wrkbuf, ep = wrkbuf + MAXPACKETSIZE; --len >= 0; ++iov) {
  71. int plen = iov->iov_len;
  72. if (cp + plen >= ep) {
  73. errno = E2BIG;
  74. return (-1);
  75. }
  76. memcpy(cp, iov->iov_base, plen);
  77. cp += plen;
  78. }
  79. return (send(s, (char*)wrkbuf, cp - wrkbuf, flags));
  80. }
  81. */
  82. #endif
  83. int Network::command(int argc, const char*const* argv)
  84. {
  85. if (argc == 2) {
  86. Tcl& tcl = Tcl::instance();
  87. if (strcmp(argv[1], "flush") == 0) {
  88. if (mode_ == O_RDWR || mode_ == O_RDONLY) {
  89. unsigned char buf[1024];
  90. sockaddr from;     
  91. double ts;
  92. while (recv(buf, sizeof(buf), from, ts) > 0)
  93. ;
  94. }
  95. return (TCL_OK);
  96. }
  97. if (strcmp(argv[1], "mode") == 0) {
  98. tcl.result(modename(mode_));
  99. return (TCL_OK);
  100. }
  101. }
  102. return (TclObject::command(argc, argv));
  103. }
  104. int
  105. Network::nonblock(int fd)
  106. {       
  107. #ifdef WIN32
  108. u_long flag = 1;
  109. if (ioctlsocket(fd, FIONBIO, &flag) == -1) {
  110. fprintf(stderr,
  111.     "Network::nonblock(): ioctlsocket: FIONBIO: %lun",
  112.     GetLastError());
  113. return -1;
  114. }
  115. #else
  116.         int flags;
  117. if ((flags = fcntl(fd, F_GETFL, 0)) < 0) {
  118. perror("Network::nonblock(): fcntl");
  119. return (-1);
  120. }
  121. #if defined(hpux) || defined(__hpux)
  122.         flags |= O_NONBLOCK;
  123. #else
  124.         flags |= O_NONBLOCK|O_NDELAY;
  125. #endif
  126.         if (fcntl(fd, F_SETFL, flags) == -1) {
  127.                 perror("Network::nonblock(): fcntl: F_SETFL");
  128. return -1;
  129.         }
  130. #endif
  131. return 0;
  132. }
  133. int
  134. Network::parsemode(const char *mname)
  135. {
  136. if (strcmp(mname, "readonly") == 0) {
  137. return (O_RDONLY);
  138. } else if (strcmp(mname, "readwrite") == 0) {
  139. return (O_RDWR);
  140. } else if (strcmp(mname, "writeonly") == 0) {
  141. return (O_WRONLY);
  142. }
  143. return (::atoi(mname));
  144. }
  145. char *
  146. Network::modename(int mode)
  147. {
  148. switch (mode) {
  149. case O_RDONLY:
  150. return ("readonly");
  151. case O_WRONLY:
  152. return ("writeonly");
  153. case O_RDWR:
  154. return ("readwrite");
  155. }
  156. return ("unknown");
  157. }