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

📄 rvsocket.c

📁 h.248协议源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#else
#if defined(IP_MULTICAST_LOOP)
    unsigned char loopback;  /* IPv4 requires a char size value */
    size = sizeof(loopback);
    succeeded = (rvSocketGetSockOpt_(*s, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&loopback, &size) == 0);
    *loop = (loopback == 0) ? rvFalse : rvTrue;
#endif
#endif

    return succeeded;
}

RvBool rvSocketSetMulticastHops(RvSocket* s, int hops) {
    RvBool hopsSet= rvFalse;

#if defined(RV_INET_IPV6)
#if defined(IPV6_MULTICAST_HOPS)
    int           ttl = hops;  /* IPv6 requires a int size value  */
    hopsSet = (rvSocketSetSockOpt_(*s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char*)&ttl, sizeof(ttl)) == 0);
#endif
#else
#if defined(IP_MULTICAST_TTL)
    unsigned char ttl = hops;  /* IPv4 requires a char size value */
    hopsSet = (rvSocketSetSockOpt_(*s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl)) == 0);
#endif
#endif
    
#if (defined(RV_DEBUG_ON) && (RV_LOGMASK & RV_LOGLEVEL_ERROR))    
    if(!hopsSet)
    {
        char buffer[256];  
        int error = rvGetLastError();
        sprintf(buffer,"RvSocket(Port = %i): Failed to set multicast TTL to %i  (Error = %i, %s).",rvSocketGetPort(s), hops, error, rvGetLastErrorAsString(error));
        rvLogError(&rvLog,buffer);
    }
#endif

    return hopsSet;
}


RvBool rvSocketGetMulticastHops(RvSocket* s, int* hops) {
    RvBool succeeded = rvFalse;
    int    size;

#if defined(RV_INET_IPV6)
#if defined(IPV6_MULTICAST_HOPS)
    int ttl;  /* IPv6 requires a int size value  */
    size = sizeof(ttl);
    succeeded = (rvSocketGetSockOpt_(*s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char*)&ttl, &size) == 0);
    *hops = ttl;
#endif
#else
#if defined(IP_MULTICAST_TTL)
    unsigned char ttl;  /* IPv4 requires a char size value */
    size = sizeof(ttl);
    succeeded = (rvSocketGetSockOpt_(*s, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, &size) == 0);
    *hops = ttl;
#endif
#endif

    return succeeded;
}

RvBool rvSocketSetTypeOfService(RvSocket* s, RvUint8 tos)
{
    RvBool tosSet = rvFalse;

#if (defined(IP_TOS) && !defined(RV_INET_IPV6))
    tosSet = (rvSocketSetSockOpt_(*s, IPPROTO_IP, IP_TOS, (char*)&tos, sizeof(tos)) == 0);
#endif

#if (defined(RV_DEBUG_ON) && (RV_LOGMASK & RV_LOGLEVEL_WARNING))
#if !defined(RV_INET_IPV6)
    if(!tosSet)
    {
        char buffer[128];  
        int error = rvGetLastError();
        sprintf(buffer,"RvSocket(Port = %i): Failed to set type of service to %08X (Error = %i, %s).", rvSocketGetPort(s), tos, error, rvGetLastErrorAsString(error));
        rvLogWarning(&rvLog,buffer);
    }
#else
    {
        char buffer[128];  
        sprintf(buffer,"RvSocket(Port = %i): Failed to set type of service to %08X (Option not supported).", rvSocketGetPort(s), tos);
        rvLogWarning(&rvLog,buffer);
    }
#endif
#endif

    return tosSet;
}

RvBool rvSocketGetTypeOfService(RvSocket* s, RvUint8* tos)
{
    RvBool succeeded = rvFalse;
    int    size = sizeof(*tos);

#if (defined(IP_TOS) && !defined(RV_INET_IPV6))
    succeeded = (rvSocketGetSockOpt_(*s, IPPROTO_IP, IP_TOS, (char*)tos, &size) == 0);
#endif

    return succeeded;
}

RvBool rvSocketJoinMulticastGroup(RvSocket* s, RvUint32 mcastip, RvUint32 ipaddr) {
    RvBool joined = rvFalse;

#if defined(IP_ADD_MEMBERSHIP)
#if defined(RV_SOCKETS_NUCLEUS)
    IP_MREQ mreq;

    mreq.sck_multiaddr = mcastip;
    mreq.sck_inaddr = ipaddr;
#else
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = mcastip;
    mreq.imr_interface.s_addr = ipaddr;
#endif

    joined = (rvSocketSetSockOpt_(*s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == 0);



#if (defined(RV_DEBUG_ON) && (RV_LOGMASK & (RV_LOGLEVEL_INFO4|RV_LOGLEVEL_ERROR)))
    {
        char buffer[256];  
        char addrbuf[16];
        int offset;
        int error = rvGetLastError();
        
        offset  = sprintf(buffer,"RvSocket(Port = %i): ", rvSocketGetPort(s));
        if(joined)
            offset += sprintf(&buffer[offset],"Joined multicast group: ");
        else
            offset += sprintf(&buffer[offset],"Failed to join multicast group (Error = %i, %s): ", error, rvGetLastErrorAsString(error));
#if defined(RV_SOCKETS_NUCLEUS)
        offset += sprintf(&buffer[offset],"\n  %s:", rvInetNtoa(mcastip, addrbuf));
        offset += sprintf(&buffer[offset],"%s",rvInetNtoa(ipaddr, addrbuf));
#else
        offset += sprintf(&buffer[offset],"\n  %s:", rvInetNtoa(*(struct in_addr *)&mcastip, addrbuf));
        offset += sprintf(&buffer[offset],"%s",rvInetNtoa(*(struct in_addr *)&ipaddr, addrbuf));
#endif
        offset += sprintf(&buffer[offset],".");

        if(joined)
            rvLogInfo4(&rvLog,buffer);
        else
            rvLogError(&rvLog,buffer);
    }
#endif
#endif

    return joined;
}


RvBool rvSocketLeaveMulticastGroup(RvSocket* s, RvUint32 mcastip, RvUint32 ipaddr) {
    RvBool left = rvFalse;

#if defined(IP_DROP_MEMBERSHIP)

#if defined(RV_SOCKETS_NUCLEUS)
    IP_MREQ mreq;
    mreq.sck_multiaddr = mcastip;
    mreq.sck_inaddr = ipaddr;
#else
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = mcastip;
    mreq.imr_interface.s_addr = ipaddr;
#endif

    left = (rvSocketSetSockOpt_(*s, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) == 0);

#if (defined(RV_DEBUG_ON) && (RV_LOGMASK & (RV_LOGLEVEL_INFO4|RV_LOGLEVEL_ERROR)))
    {
        char buffer[128];  
        char addrbuf[16];
        int offset;
        int error = rvGetLastError();

        offset  = sprintf(buffer,"RvSocket(Port = %i): ", rvSocketGetPort(s));
        if(left)
            offset += sprintf(&buffer[offset],"Left multicast group: ");
        else
            offset += sprintf(&buffer[offset],"Failed to leave multicast group (Error = %i, %s): ", error, rvGetLastErrorAsString(error));
#if defined(RV_SOCKETS_NUCLEUS)
        offset += sprintf(&buffer[offset],"\n  %s:", rvInetNtoa(mcastip, addrbuf));
        offset += sprintf(&buffer[offset],"%s",rvInetNtoa(ipaddr, addrbuf));
#else
        offset += sprintf(&buffer[offset],"\n  %s:", rvInetNtoa(*(struct in_addr *)&mcastip, addrbuf));
        offset += sprintf(&buffer[offset],"%s",rvInetNtoa(*(struct in_addr *)&ipaddr, addrbuf));
#endif
        offset += sprintf(&buffer[offset],".");

        if(left)
            rvLogInfo4(&rvLog,buffer);
        else
            rvLogError(&rvLog,buffer);
    }
#endif
#endif
    
    return left;
}

RvBool rvSocketSetRecvBufferSize(RvSocket* s, int size) {
    RvBool succeeded = rvFalse;
#if defined(SO_RCVBUF)
     succeeded = (rvSocketSetSockOpt_(*s, SOL_SOCKET, SO_RCVBUF, (void*)&size,
      sizeof(size)) == 0);
#endif
    return succeeded;
}

RvBool rvSocketSetSendBufferSize(RvSocket* s, int size) {
    RvBool succeeded = rvFalse;
#if defined(SO_SNDBUF)
    succeeded = (rvSocketSetSockOpt_(*s, SOL_SOCKET, SO_SNDBUF, (void*)&size, 
      sizeof(size)) == 0);
#endif
    return succeeded;
}

RvBool rvSocketGetRecvBufferSize(RvSocket* s, int* bufferSize) {
    RvBool succeeded = rvFalse;

#if defined(SO_RCVBUF)
    int size = sizeof(*bufferSize);    
    succeeded = (rvSocketGetSockOpt_(*s, SOL_SOCKET, SO_RCVBUF, (void*)bufferSize,
                             &size) == 0);
#endif
    return succeeded;
}

RvBool rvSocketGetSendBufferSize(RvSocket* s, int* bufferSize) {
    RvBool succeeded = rvFalse;

#if defined(SO_SNDBUF)
    int size = sizeof(*bufferSize);    
    succeeded = (rvSocketGetSockOpt_(*s, SOL_SOCKET, SO_SNDBUF, (void*)bufferSize, 
                            &size) == 0);
#endif
    return succeeded;
}



⌨️ 快捷键说明

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