⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prmapopt.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#else                PR_SetError( PR_NOT_IMPLEMENTED_ERROR, 0 );                return PR_FAILURE;#endif            }            case PR_SockOpt_Reuseaddr:            case PR_SockOpt_Keepalive:            case PR_SockOpt_NoDelay:            case PR_SockOpt_Broadcast:            {#ifdef WIN32 /* Winsock */                BOOL value;#else                PRIntn value;#endif                value = (data->value.reuse_addr) ? 1 : 0;                rv = _PR_MD_SETSOCKOPT(                    fd, level, name, (char*)&value, sizeof(value));                break;            }            case PR_SockOpt_McastLoopback:            {#ifdef WIN32 /* Winsock */                BOOL bool;#else                PRUint8 bool;#endif                bool = data->value.mcast_loopback ? 1 : 0;                rv = _PR_MD_SETSOCKOPT(                    fd, level, name, (char*)&bool, sizeof(bool));                break;            }            case PR_SockOpt_RecvBufferSize:            case PR_SockOpt_SendBufferSize:            case PR_SockOpt_MaxSegment:            {                PRIntn value = data->value.recv_buffer_size;                rv = _PR_MD_SETSOCKOPT(                    fd, level, name, (char*)&value, sizeof(value));                break;            }            case PR_SockOpt_IpTimeToLive:            case PR_SockOpt_IpTypeOfService:            {                /* These options should really be an int (or PRIntn). */                rv = _PR_MD_SETSOCKOPT(                    fd, level, name, (char*)&data->value.ip_ttl, sizeof(PRUintn));                break;            }            case PR_SockOpt_McastTimeToLive:            {#ifdef WIN32 /* Winsock */                int ttl;#else                PRUint8 ttl;#endif                ttl = data->value.mcast_ttl;                rv = _PR_MD_SETSOCKOPT(                    fd, level, name, (char*)&ttl, sizeof(ttl));                break;            }#ifdef IP_ADD_MEMBERSHIP            case PR_SockOpt_AddMember:            case PR_SockOpt_DropMember:            {                struct ip_mreq mreq;                mreq.imr_multiaddr.s_addr =                    data->value.add_member.mcaddr.inet.ip;                mreq.imr_interface.s_addr =                    data->value.add_member.ifaddr.inet.ip;                rv = _PR_MD_SETSOCKOPT(                    fd, level, name, (char*)&mreq, sizeof(mreq));                break;            }#endif /* IP_ADD_MEMBERSHIP */            case PR_SockOpt_McastInterface:            {                /* This option is a struct in_addr. */                rv = _PR_MD_SETSOCKOPT(                    fd, level, name, (char*)&data->value.mcast_if.inet.ip,                    sizeof(data->value.mcast_if.inet.ip));                break;            }            default:                PR_NOT_REACHED("Unknown socket option");                break;        }      }    return rv;}  /* _PR_SocketSetSocketOption */#endif /* ! _PR_PTHREADS *//* ********************************************************************* ********************************************************************* ** ** Make sure that the following is at the end of this file, ** because we will be playing with macro redefines. ** ********************************************************************* ********************************************************************* */#if defined(VMS)/*** Sad but true. The DEC C header files define the following socket options** differently to what UCX is expecting. The values that UCX expects are** defined in SYS$LIBRARY:UCX$INETDEF.H. We redefine them here to the values** that UCX expects. Note that UCX V4.x will only accept these values while** UCX V5.x will accept either. So in theory this hack can be removed once** UCX V5 is the minimum.*/#undef IP_MULTICAST_IF#undef IP_MULTICAST_TTL#undef IP_MULTICAST_LOOP#undef IP_ADD_MEMBERSHIP#undef IP_DROP_MEMBERSHIP#include <ucx$inetdef.h>#define IP_MULTICAST_IF    UCX$C_IP_MULTICAST_IF#define IP_MULTICAST_TTL   UCX$C_IP_MULTICAST_TTL#define IP_MULTICAST_LOOP  UCX$C_IP_MULTICAST_LOOP#define IP_ADD_MEMBERSHIP  UCX$C_IP_ADD_MEMBERSHIP#define IP_DROP_MEMBERSHIP UCX$C_IP_DROP_MEMBERSHIP#endif/* * Not every platform has all the socket options we want to * support.  Some older operating systems such as SunOS 4.1.3 * don't have the IP multicast socket options.  Win32 doesn't * have TCP_MAXSEG. * * To deal with this problem, we define the missing socket * options as _PR_NO_SUCH_SOCKOPT.  _PR_MapOptionName() fails with * PR_OPERATION_NOT_SUPPORTED_ERROR if a socket option not * available on the platform is requested. *//* * Sanity check.  SO_LINGER and TCP_NODELAY should be available * on all platforms.  Just to make sure we have included the * appropriate header files.  Then any undefined socket options * are really missing. */#if !defined(SO_LINGER)#error "SO_LINGER is not defined"#endif/* * Some platforms, such as NCR 2.03, don't have TCP_NODELAY defined * in <netinet/tcp.h> */#if !defined(NCR)#if !defined(TCP_NODELAY)#error "TCP_NODELAY is not defined"#endif#endif/* * Make sure the value of _PR_NO_SUCH_SOCKOPT is not * a valid socket option. */#define _PR_NO_SUCH_SOCKOPT -1#ifndef SO_KEEPALIVE#define SO_KEEPALIVE        _PR_NO_SUCH_SOCKOPT#endif#ifndef SO_SNDBUF#define SO_SNDBUF           _PR_NO_SUCH_SOCKOPT#endif#ifndef SO_RCVBUF#define SO_RCVBUF           _PR_NO_SUCH_SOCKOPT#endif#ifndef IP_MULTICAST_IF                 /* set/get IP multicast interface   */#define IP_MULTICAST_IF     _PR_NO_SUCH_SOCKOPT#endif#ifndef IP_MULTICAST_TTL                /* set/get IP multicast timetolive  */#define IP_MULTICAST_TTL    _PR_NO_SUCH_SOCKOPT#endif#ifndef IP_MULTICAST_LOOP               /* set/get IP multicast loopback    */#define IP_MULTICAST_LOOP   _PR_NO_SUCH_SOCKOPT#endif#ifndef IP_ADD_MEMBERSHIP               /* add  an IP group membership      */#define IP_ADD_MEMBERSHIP   _PR_NO_SUCH_SOCKOPT#endif#ifndef IP_DROP_MEMBERSHIP              /* drop an IP group membership      */#define IP_DROP_MEMBERSHIP  _PR_NO_SUCH_SOCKOPT#endif#ifndef IP_TTL                          /* set/get IP Time To Live          */#define IP_TTL              _PR_NO_SUCH_SOCKOPT#endif#ifndef IP_TOS                          /* set/get IP Type Of Service       */#define IP_TOS              _PR_NO_SUCH_SOCKOPT#endif#ifndef TCP_NODELAY                     /* don't delay to coalesce data     */#define TCP_NODELAY         _PR_NO_SUCH_SOCKOPT#endif#ifndef TCP_MAXSEG                      /* maxumum segment size for tcp     */#define TCP_MAXSEG          _PR_NO_SUCH_SOCKOPT#endif#ifndef SO_BROADCAST                 /* enable broadcast on udp sockets */#define SO_BROADCAST        _PR_NO_SUCH_SOCKOPT#endifPRStatus _PR_MapOptionName(    PRSockOption optname, PRInt32 *level, PRInt32 *name){    static PRInt32 socketOptions[PR_SockOpt_Last] =    {        0, SO_LINGER, SO_REUSEADDR, SO_KEEPALIVE, SO_RCVBUF, SO_SNDBUF,        IP_TTL, IP_TOS, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP,        IP_MULTICAST_IF, IP_MULTICAST_TTL, IP_MULTICAST_LOOP,        TCP_NODELAY, TCP_MAXSEG, SO_BROADCAST    };    static PRInt32 socketLevels[PR_SockOpt_Last] =    {        0, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET,        IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP,        IPPROTO_IP, IPPROTO_IP, IPPROTO_IP,        IPPROTO_TCP, IPPROTO_TCP, SOL_SOCKET    };    if ((optname < PR_SockOpt_Linger)    || (optname >= PR_SockOpt_Last))    {        PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);        return PR_FAILURE;    }    if (socketOptions[optname] == _PR_NO_SUCH_SOCKOPT)    {        PR_SetError(PR_OPERATION_NOT_SUPPORTED_ERROR, 0);        return PR_FAILURE;    }    *name = socketOptions[optname];    *level = socketLevels[optname];    return PR_SUCCESS;}  /* _PR_MapOptionName */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -