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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclIOSock.c --
  3.  *
  4.  * Common routines used by all socket based channel types.
  5.  *
  6.  * Copyright (c) 1995-1997 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tclIOSock.c,v 1.7 2002/07/29 16:54:41 rmax Exp $
  12.  */
  13. #include "tclInt.h"
  14. #include "tclPort.h"
  15. /*
  16.  *---------------------------------------------------------------------------
  17.  *
  18.  * TclSockGetPort --
  19.  *
  20.  * Maps from a string, which could be a service name, to a port.
  21.  * Used by socket creation code to get port numbers and resolve
  22.  * registered service names to port numbers.
  23.  *
  24.  * Results:
  25.  * A standard Tcl result.  On success, the port number is returned
  26.  * in portPtr. On failure, an error message is left in the interp's
  27.  * result.
  28.  *
  29.  * Side effects:
  30.  * None.
  31.  *
  32.  *---------------------------------------------------------------------------
  33.  */
  34. int
  35. TclSockGetPort(interp, string, proto, portPtr)
  36.     Tcl_Interp *interp;
  37.     char *string; /* Integer or service name */
  38.     char *proto; /* "tcp" or "udp", typically */
  39.     int *portPtr; /* Return port number */
  40. {
  41.     struct servent *sp; /* Protocol info for named services */
  42.     Tcl_DString ds;
  43.     CONST char *native;
  44.     if (Tcl_GetInt(NULL, string, portPtr) != TCL_OK) {
  45. /*
  46.  * Don't bother translating 'proto' to native.
  47.  */
  48.  
  49. native = Tcl_UtfToExternalDString(NULL, string, -1, &ds);
  50. sp = getservbyname(native, proto); /* INTL: Native. */
  51. Tcl_DStringFree(&ds);
  52. if (sp != NULL) {
  53.     *portPtr = ntohs((unsigned short) sp->s_port);
  54.     return TCL_OK;
  55. }
  56.     }
  57.     if (Tcl_GetInt(interp, string, portPtr) != TCL_OK) {
  58. return TCL_ERROR;
  59.     }
  60.     if (*portPtr > 0xFFFF) {
  61.         Tcl_AppendResult(interp, "couldn't open socket: port number too high",
  62.                 (char *) NULL);
  63. return TCL_ERROR;
  64.     }
  65.     return TCL_OK;
  66. }
  67. /*
  68.  *----------------------------------------------------------------------
  69.  *
  70.  * TclSockMinimumBuffers --
  71.  *
  72.  * Ensure minimum buffer sizes (non zero).
  73.  *
  74.  * Results:
  75.  * A standard Tcl result.
  76.  *
  77.  * Side effects:
  78.  * Sets SO_SNDBUF and SO_RCVBUF sizes.
  79.  *
  80.  *----------------------------------------------------------------------
  81.  */
  82. int
  83. TclSockMinimumBuffers(sock, size)
  84.     int sock; /* Socket file descriptor */
  85.     int size; /* Minimum buffer size */
  86. {
  87.     int current;
  88.     socklen_t len;
  89.     len = sizeof(int);
  90.     getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&current, &len);
  91.     if (current < size) {
  92. len = sizeof(int);
  93. setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&size, len);
  94.     }
  95.     len = sizeof(int);
  96.     getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&current, &len);
  97.     if (current < size) {
  98. len = sizeof(int);
  99. setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&size, len);
  100.     }
  101.     return TCL_OK;
  102. }