📄 rvsocket.c
字号:
#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 + -