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

📄 rvsocket_.c

📁 h.248协议源码
💻 C
字号:
/*****************************************************************************
Filename   : rvsocket_.c
Description: Socket porting interface definition.
******************************************************************************
                Copyright (c) 1999 RADVision Inc.
******************************************************************************
NOTICE:
This document contains information that is proprietary to RADVision Inc.
No part of this publication may be reproduced in any form whatsoever 
without written prior approval by RADVision Inc.

RADVision Inc. reserves the right to revise this publication and make 
changes without obligation to notify any person of such revisions or 
changes.
******************************************************************************
$Revision:$
$Date:$
$Author: S. Cipolli$
*****************************************************************************/

#include "rvsocket_.h"
#include "rvsocketaddr.h"

#if defined(RV_SOCKETS_BSD)
#if defined(RV_OS_REDHAT) || defined(RV_OS_SOLARIS)
#include <fcntl.h>
#include <sys/file.h>
#endif
#endif

#if defined(RV_SOCKETS_NUCLEUS)
/* redefine stuff for Nucleus so we don't have to special case eveything */
#define accept NU_Accept
#define recvfrom NU_Recv_From

/* Nucleus port numbers have to be unswapped because its not in network order */
#define rvNucPortSwap TLS_Intswap
#endif

#if defined(RV_SOCKETS_PSOS)
   /* pSOS sockets are thread specific and sharable only by the owning task. */
   /* Thus the only way not to leave sockets open is to create them in the */
   /* sharer task, get a shared handle when we need to make a socket call, and */
   /* close that shared handle when we're done. */
#include "rvsharer.h"

long rvSocketBind_(RvSocket socket, const RvSocketAddr *addressPtr) {
	RvSocket oursocket;
	struct sockaddr *saddr;
	int addrlen;
	long result;

	oursocket = rvSharerShareSocket(socket);
	saddr = (struct sockaddr *)rvSocketAddrGetRawAddress(addressPtr);
	addrlen = rvSocketAddrGetLength(addressPtr);
	result = bind(oursocket, saddr, addrlen);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketListen_(RvSocket socket, int backlog) {
	RvSocket oursocket;
	long result;
	
	oursocket = rvSharerShareSocket(socket);
	result = listen(oursocket, backlog);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketConnect_(RvSocket socket, RvSocketAddr *addressPtr) {
	RvSocket oursocket;
	struct sockaddr *saddr;
	int addrlen;
	long result;

	oursocket = rvSharerShareSocket(socket);
	saddr = (struct sockaddr *)rvSocketAddrGetRawAddress(addressPtr);
	addrlen = rvSocketAddrGetLength(addressPtr);
	result = connect(oursocket,  saddr, addrlen);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketSendTo_(RvSocket socket, char *buf, int len, int flags, const RvSocketAddr *addressPtr) {
	RvSocket oursocket;
	struct sockaddr *saddr;
	int addrlen;
	long result;

	oursocket = rvSharerShareSocket(socket);
	saddr = (struct sockaddr *)rvSocketAddrGetRawAddress(addressPtr);
	addrlen = rvSocketAddrGetLength(addressPtr);
	result = sendto(oursocket, buf, len, flags, saddr, addrlen);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketSetSockOpt_(RvSocket socket, int level, int optname, char *optval, int optlen) {
	RvSocket oursocket;
	long result;

	oursocket = rvSharerShareSocket(socket);
	result = setsockopt(oursocket, level, optname, optval, optlen);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketGetSockOpt_(RvSocket socket, int level, int optname, char *optval, int* optlen) {
	RvSocket oursocket;
	long result;

	oursocket = rvSharerShareSocket(socket);
	result = getsockopt(oursocket, level, optname, optval, optlen);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketRecv_(RvSocket socket, char *buffer, int len, int flags) {
	RvSocket oursocket;
	long result;

	oursocket = rvSharerShareSocket(socket);
	result = recv(oursocket, buffer, len, flags);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketSend_(RvSocket socket, char *buf, int len, int flags) {
	RvSocket oursocket;
	long result;

	oursocket = rvSharerShareSocket(socket);
	result = send(oursocket, buf, len, flags);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketBlock_(RvSocket socket)
{
	RvSocket oursocket;
	long result;
	unsigned long blockon = 0;
	
	oursocket = rvSharerShareSocket(socket);
    result = ioctl(oursocket, FIONBIO, &blockon);
	rvSharerClose(oursocket);
	return result;
}

long rvSocketUnblock_(RvSocket socket)
{
	RvSocket oursocket;
	long result;
	unsigned long blockoff = 1;

	oursocket = rvSharerShareSocket(socket);
	result = ioctl(oursocket, FIONBIO, &blockoff);
	rvSharerClose(oursocket);
	return result;
}

#endif

RvBool rvSocketAccept_(RvSocket socket, RvSocket* cSocket, RvSocketAddr *addressPtr)
{			    
	struct sockaddr *saddr;
#if defined(RV_SOCKETS_PSOS)
	RvSocket oursocket;
#endif
	
	saddr = (struct sockaddr *)rvSocketAddrGetRawAddress(addressPtr);
    addressPtr->length = RV_SOCKADDR_MAXSIZE;
#if defined(RV_SOCKETS_PSOS)
	/* See pSOS note above */
	oursocket = rvSharerShareSocket(socket);
	*cSocket = accept(oursocket, saddr, &addressPtr->length);
	rvSharerClose(oursocket);
#else
	*cSocket = accept(socket, saddr, &addressPtr->length);
#endif
#if defined(RV_SOCKETS_NUCLEUS)
	saddr->port = rvNucPortSwap(saddr->port); /* Nucleus internal is unswapped */
#endif
    rvSocketAddrSetProtocolFromSockAddr(addressPtr);
    
    return (*cSocket != -1);
}

RvBool rvSocketGetSockName_(RvSocket socket, RvSocketAddr *addressPtr)
{
    RvBool retVal;
#if defined(RV_SOCKETS_PSOS)
	RvSocket oursocket;
#endif
#if defined(RV_SOCKETS_NUCLEUS)
	struct sockaddr_struct temp;
	struct addr_struct *sptr;
	INT16 len;
#endif

	addressPtr->length = RV_SOCKADDR_MAXSIZE;
#if defined(RV_SOCKETS_NUCLEUS) /* hardcode for Nucleus nonsense */
	len = sizeof(struct sockaddr_struct);
	if(NU_Get_Sock_Name(socket, &temp, &len) == 0) {
		retVal = rvTrue;
		sptr = (struct addr_struct *)&addressPtr->address;
		sptr->family = AF_INET;
		sptr->port = rvNucPortSwap(temp.port_num); /* Nucleus internal is unswapped */
		memcpy(&sptr->id.is_ip_addrs, &temp.ip_num.is_ip_addrs, 4);
	} else retVal = rvFalse;
#else
#if defined(RV_SOCKETS_PSOS)
	/* See pSOS note above */
	oursocket = rvSharerShareSocket(socket);
	retVal = getsockname(oursocket,(struct sockaddr *)&(addressPtr->address), &addressPtr->length) == 0;
	rvSharerClose(oursocket);
#else	
	retVal = getsockname(socket,(struct sockaddr *)&(addressPtr->address), &addressPtr->length) == 0;
#endif
#endif
	rvSocketAddrSetProtocolFromSockAddr(addressPtr);

    return retVal;
}

RvBool rvSocketGetPeerName_(RvSocket socket, RvSocketAddr *addressPtr)
{
    RvBool retVal;
#if defined(RV_SOCKETS_PSOS)
	RvSocket oursocket;
#endif
#if defined(RV_SOCKETS_NUCLEUS)
	struct sockaddr_struct temp;
	struct addr_struct *sptr;
	INT16 len;
	
#endif
	addressPtr->length = RV_SOCKADDR_MAXSIZE;
#if defined(RV_SOCKETS_NUCLEUS) /* hardcode for Nucleus nonsense */
	len = sizeof(struct sockaddr_struct);
	if(NU_Get_Peer_Name(socket, &temp, &len) == 0) {
		retVal = rvTrue;
		sptr = (struct addr_struct *)&addressPtr->address;
		sptr->family = AF_INET;
		sptr->port = rvNucPortSwap(temp.port_num); /* Nucleus internal is unswapped */
		memcpy(&sptr->id.is_ip_addrs, &temp.ip_num.is_ip_addrs, 4);
	} else retVal = rvFalse;
#else
#if defined(RV_SOCKETS_PSOS)
	/* See pSOS note above */
	oursocket = rvSharerShareSocket(socket);
	retVal = getpeername(oursocket,(struct sockaddr *)&(addressPtr->address), &addressPtr->length) == 0;
	rvSharerClose(oursocket);
#else
	retVal = getpeername(socket,(struct sockaddr *)&(addressPtr->address), &addressPtr->length) == 0;
#endif
#endif
	rvSocketAddrSetProtocolFromSockAddr(addressPtr);

    return retVal;
}

int rvSocketRecvFrom_(RvSocket socket, void *buffer, size_t bufferLength, int flags, RvSocketAddr *addressPtr)
{
    int retVal;
	struct sockaddr *saddr;
#if defined(RV_SOCKETS_PSOS)
	RvSocket oursocket;
#endif

	saddr = (struct sockaddr *)rvSocketAddrGetRawAddress(addressPtr);
	addressPtr->length = RV_SOCKADDR_MAXSIZE;
#if defined(RV_SOCKETS_PSOS)
	/* See pSOS note above */
	oursocket = rvSharerShareSocket(socket);
	retVal = recvfrom(oursocket, buffer, bufferLength, flags, saddr, &addressPtr->length);
	rvSharerClose(oursocket);
#else
	retVal = recvfrom(socket, buffer, bufferLength, flags, saddr, &addressPtr->length);
#endif
#if defined(RV_SOCKETS_NUCLEUS)
	saddr->family = AF_INET; /* Nucleus doesn't fill in everything in from address */
	saddr->port = rvNucPortSwap(saddr->port); /* Nucleus internal is unswapped */
#endif
    rvSocketAddrSetProtocolFromSockAddr(addressPtr);

    return retVal;
}

#if defined(RV_SOCKETS_NUCLEUS)
/* deal with Nucleus swapped port address and non-zero return codes */

int rvSocketBind_(RvSocket socket, const RvSocketAddr *addressPtr)
{
	int result;
	struct addr_struct saddr;

	/* Copy the structure since we don't want to mess with callers data */
	memcpy(&saddr, rvSocketAddrGetRawAddress(addressPtr), sizeof(saddr));
	saddr.port = rvNucPortSwap(saddr.port); /* Nucleus internal is unswapped */
	result = NU_Bind(socket, &saddr, sizeof(saddr));
	if(result > 0) result = 0; /* standard bind has 0 == OK, not >= 0 */
	return result;
}

int rvSocketConnect_(RvSocket socket, const RvSocketAddr *addressPtr)
{
	int result;
	struct addr_struct saddr;

	/* Copy the structure since we don't want to mess with callers data */
	memcpy(&saddr, rvSocketAddrGetRawAddress(addressPtr), sizeof(saddr));
	saddr.port = rvNucPortSwap(saddr.port); /* Nucleus internal is unswapped */
	result = NU_Connect(socket, &saddr, sizeof(saddr));
	if(result > 0) result = 0; /* standard bind has 0 == OK, not >= 0 */
	return result;
}

int rvSocketSendTo_(RvSocket socket, char *buf, int nbytes, int flags, const RvSocketAddr *toAddr)
{
	int result;
	struct addr_struct saddr;

	/* Copy the structure since we don't want to mess with callers data */
	memcpy(&saddr, rvSocketAddrGetRawAddress(toAddr), sizeof(saddr));
	saddr.port = rvNucPortSwap(saddr.port); /* Nucleus internal is unswapped */
	result = NU_Send_To(socket, buf, nbytes, flags, &saddr, sizeof(saddr));
	return result;
}

#endif

#if defined(RV_SOCKETS_BSD)
#if defined(RV_OS_REDHAT) || defined(RV_OS_SOLARIS)
int rvSocketBlock_(RvSocket socket)
{
	int fileflags;
	
	fileflags = fcntl(socket, F_GETFL, 0);
	if(fileflags < 0)
		return fileflags;

	if (fcntl(socket, F_SETFL, fileflags | FNDELAY) == -1)
		return -1;
	return 0;
}


int rvSocketUnblock_(RvSocket socket)
{
	int fileflags;

	fileflags = fcntl(socket, F_GETFL, 0);
	if(fileflags < 0)
		return fileflags;

	if (fcntl(socket, F_SETFL, fileflags & (~FNDELAY)) == -1)
		return -1;
	return 0;
}
#endif
#endif

⌨️ 快捷键说明

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