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

📄 prsocket.c

📁 Netscape NSPR库源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		raddr = &raddrCopy;	}	rv = _PR_MD_FAST_ACCEPT_READ(sd, &newSock, raddr, buf, amount, 	    timeout, PR_TRUE, NULL, NULL);	if (rv < 0) {		rv = -1;	} else {		/* Successfully accepted and read; create the new PRFileDesc */		*nd = PR_AllocFileDesc(newSock, PR_GetTCPMethods());		if (*nd == 0) {			_PR_MD_CLOSE_SOCKET(newSock);			/* PR_AllocFileDesc() has invoked PR_SetError(). */			rv = -1;		} else {			(*nd)->secret->md.io_model_committed = PR_TRUE;			(*nd)->secret->md.accepted_socket = PR_TRUE;			memcpy(&(*nd)->secret->md.peer_addr, *raddr,				PR_NETADDR_SIZE(*raddr));#ifdef _PR_INET6			if (AF_INET6 == *raddr->raw.family)        		*raddr->raw.family = PR_AF_INET6;#endif		}	}	return rv;}PR_IMPLEMENT(PRInt32) PR_NTFast_AcceptRead_WithTimeoutCallback(PRFileDesc *sd, PRFileDesc **nd, PRNetAddr **raddr, void *buf, PRInt32 amount,PRIntervalTime timeout,_PR_AcceptTimeoutCallback callback,void *callbackArg){	PRInt32 rv;	PRInt32 newSock;	PRThread *me = _PR_MD_CURRENT_THREAD();	PRNetAddr *raddrCopy;	if (_PR_PENDING_INTERRUPT(me)) {		me->flags &= ~_PR_INTERRUPT;		PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);		return -1;	}	if (_PR_IO_PENDING(me)) {		PR_SetError(PR_IO_PENDING_ERROR, 0);		return -1;	}	*nd = NULL;	if (raddr == NULL) {		raddr = &raddrCopy;	}	rv = _PR_MD_FAST_ACCEPT_READ(sd, &newSock, raddr, buf, amount,	    timeout, PR_TRUE, callback, callbackArg);	if (rv < 0) {		rv = -1;	} else {		/* Successfully accepted and read; create the new PRFileDesc */		*nd = PR_AllocFileDesc(newSock, PR_GetTCPMethods());		if (*nd == 0) {			_PR_MD_CLOSE_SOCKET(newSock);			/* PR_AllocFileDesc() has invoked PR_SetError(). */			rv = -1;		} else {			(*nd)->secret->md.io_model_committed = PR_TRUE;			(*nd)->secret->md.accepted_socket = PR_TRUE;			memcpy(&(*nd)->secret->md.peer_addr, *raddr,				PR_NETADDR_SIZE(*raddr));#ifdef _PR_INET6			if (AF_INET6 == *raddr->raw.family)        		*raddr->raw.family = PR_AF_INET6;#endif		}	}	return rv;}#endif /* WINNT */#ifdef WINNTPR_IMPLEMENT(void)PR_NTFast_UpdateAcceptContext(PRFileDesc *socket, PRFileDesc *acceptSocket){	_PR_MD_UPDATE_ACCEPT_CONTEXT(		socket->secret->md.osfd, acceptSocket->secret->md.osfd);}#endif /* WINNT */static PRInt32 PR_CALLBACK SocketSendFile(    PRFileDesc *sd, PRSendFileData *sfd,    PRTransmitFileFlags flags, PRIntervalTime timeout){	PRInt32 rv;	PRThread *me = _PR_MD_CURRENT_THREAD();	if (_PR_PENDING_INTERRUPT(me)) {		me->flags &= ~_PR_INTERRUPT;		PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0);		return -1;	}	if (_PR_IO_PENDING(me)) {		PR_SetError(PR_IO_PENDING_ERROR, 0);		return -1;	}	/* The socket must be in blocking mode. */	if (sd->secret->nonblocking) {		PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);		return -1;	}#if defined(WINNT)	rv = _PR_MD_SENDFILE(sd, sfd, flags, timeout);	if ((rv >= 0) && (flags == PR_TRANSMITFILE_CLOSE_SOCKET)) {		/*		 * This should be kept the same as SocketClose, except		 * that _PR_MD_CLOSE_SOCKET(sd->secret->md.osfd) should		 * not be called because the socket will be recycled.		 */		PR_FreeFileDesc(sd);	}#else	rv = PR_EmulateSendFile(sd, sfd, flags, timeout);#endif	/* WINNT */	return rv;}static PRInt32 PR_CALLBACK SocketTransmitFile(PRFileDesc *sd, PRFileDesc *fd, const void *headers, PRInt32 hlen, PRTransmitFileFlags flags,PRIntervalTime timeout){	PRSendFileData sfd;	sfd.fd = fd;	sfd.file_offset = 0;	sfd.file_nbytes = 0;	sfd.header = headers;	sfd.hlen = hlen;	sfd.trailer = NULL;	sfd.tlen = 0;	return(SocketSendFile(sd, &sfd, flags, timeout));}static PRStatus PR_CALLBACK SocketGetName(PRFileDesc *fd, PRNetAddr *addr){	PRInt32 result;	PRUint32 addrlen;	addrlen = sizeof(PRNetAddr);	result = _PR_MD_GETSOCKNAME(fd, addr, &addrlen);	if (result < 0) {		return PR_FAILURE;	}#ifdef _PR_INET6	if (AF_INET6 == addr->raw.family)        addr->raw.family = PR_AF_INET6;#endif	PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE);	PR_ASSERT(IsValidNetAddrLen(addr, addrlen) == PR_TRUE);	return PR_SUCCESS;}static PRStatus PR_CALLBACK SocketGetPeerName(PRFileDesc *fd, PRNetAddr *addr){	PRInt32 result;	PRUint32 addrlen;	addrlen = sizeof(PRNetAddr);	result = _PR_MD_GETPEERNAME(fd, addr, &addrlen);	if (result < 0) {		return PR_FAILURE;	}#ifdef _PR_INET6	if (AF_INET6 == addr->raw.family)        addr->raw.family = PR_AF_INET6;#endif	PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE);	PR_ASSERT(IsValidNetAddrLen(addr, addrlen) == PR_TRUE);	return PR_SUCCESS;}static PRInt16 PR_CALLBACK SocketPoll(    PRFileDesc *fd, PRInt16 in_flags, PRInt16 *out_flags){#ifdef XP_MAC#pragma unused( fd, in_flags )#endif    *out_flags = 0;    return in_flags;}  /* SocketPoll */static PRIOMethods tcpMethods = {	PR_DESC_SOCKET_TCP,	SocketClose,	SocketRead,	SocketWrite,	SocketAvailable,	SocketAvailable64,	SocketSync,	(PRSeekFN)_PR_InvalidInt,	(PRSeek64FN)_PR_InvalidInt64,	(PRFileInfoFN)_PR_InvalidStatus,	(PRFileInfo64FN)_PR_InvalidStatus,	SocketWritev,	SocketConnect,	SocketAccept,	SocketBind,	SocketListen,	SocketShutdown,	SocketRecv,	SocketSend,	(PRRecvfromFN)_PR_InvalidInt,	(PRSendtoFN)_PR_InvalidInt,	SocketPoll,	SocketAcceptRead,	SocketTransmitFile,	SocketGetName,	SocketGetPeerName,	(PRReservedFN)_PR_InvalidInt,	(PRReservedFN)_PR_InvalidInt,	_PR_SocketGetSocketOption,	_PR_SocketSetSocketOption,    SocketSendFile,     SocketConnectContinue,    (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt};static PRIOMethods udpMethods = {	PR_DESC_SOCKET_UDP,	SocketClose,	SocketRead,	SocketWrite,	SocketAvailable,	SocketAvailable64,	SocketSync,	(PRSeekFN)_PR_InvalidInt,	(PRSeek64FN)_PR_InvalidInt64,	(PRFileInfoFN)_PR_InvalidStatus,	(PRFileInfo64FN)_PR_InvalidStatus,	SocketWritev,	SocketConnect,	(PRAcceptFN)_PR_InvalidDesc,	SocketBind,	SocketListen,	SocketShutdown,	SocketRecv,	SocketSend,	SocketRecvFrom,	SocketSendTo,	SocketPoll,	(PRAcceptreadFN)_PR_InvalidInt,	(PRTransmitfileFN)_PR_InvalidInt,	SocketGetName,	SocketGetPeerName,	(PRReservedFN)_PR_InvalidInt,	(PRReservedFN)_PR_InvalidInt,	_PR_SocketGetSocketOption,	_PR_SocketSetSocketOption,    (PRSendfileFN)_PR_InvalidInt,     (PRConnectcontinueFN)_PR_InvalidStatus,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt};static PRIOMethods socketpollfdMethods = {    (PRDescType) 0,    (PRCloseFN)_PR_InvalidStatus,    (PRReadFN)_PR_InvalidInt,    (PRWriteFN)_PR_InvalidInt,    (PRAvailableFN)_PR_InvalidInt,    (PRAvailable64FN)_PR_InvalidInt64,    (PRFsyncFN)_PR_InvalidStatus,    (PRSeekFN)_PR_InvalidInt,    (PRSeek64FN)_PR_InvalidInt64,    (PRFileInfoFN)_PR_InvalidStatus,    (PRFileInfo64FN)_PR_InvalidStatus,    (PRWritevFN)_PR_InvalidInt,            (PRConnectFN)_PR_InvalidStatus,            (PRAcceptFN)_PR_InvalidDesc,            (PRBindFN)_PR_InvalidStatus,            (PRListenFN)_PR_InvalidStatus,            (PRShutdownFN)_PR_InvalidStatus,        (PRRecvFN)_PR_InvalidInt,            (PRSendFN)_PR_InvalidInt,            (PRRecvfromFN)_PR_InvalidInt,        (PRSendtoFN)_PR_InvalidInt,        	SocketPoll,    (PRAcceptreadFN)_PR_InvalidInt,       (PRTransmitfileFN)_PR_InvalidInt,     (PRGetsocknameFN)_PR_InvalidStatus,        (PRGetpeernameFN)_PR_InvalidStatus,        (PRReservedFN)_PR_InvalidInt,        (PRReservedFN)_PR_InvalidInt,        (PRGetsocketoptionFN)_PR_InvalidStatus,    (PRSetsocketoptionFN)_PR_InvalidStatus,    (PRSendfileFN)_PR_InvalidInt,     (PRConnectcontinueFN)_PR_InvalidStatus,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt,     (PRReservedFN)_PR_InvalidInt};PR_IMPLEMENT(const PRIOMethods*) PR_GetTCPMethods(){	return &tcpMethods;}PR_IMPLEMENT(const PRIOMethods*) PR_GetUDPMethods(){	return &udpMethods;}static const PRIOMethods* PR_GetSocketPollFdMethods(){    return &socketpollfdMethods;}  /* PR_GetSocketPollFdMethods */#if !defined(_PR_INET6) || defined(_PR_INET6_PROBE)PR_EXTERN(PRStatus) _pr_push_ipv6toipv4_layer(PRFileDesc *fd);#if defined(_PR_INET6_PROBE)PR_EXTERN(PRBool) _pr_ipv6_is_present;PR_IMPLEMENT(PRBool) _pr_test_ipv6_socket(){PRInt32 osfd;	osfd = _PR_MD_SOCKET(AF_INET6, SOCK_STREAM, 0);	if (osfd != -1) {		_PR_MD_CLOSE_SOCKET(osfd);		return PR_TRUE;	}	return PR_FALSE;}#endif	/* _PR_INET6_PROBE */#endifPR_IMPLEMENT(PRFileDesc*) PR_Socket(PRInt32 domain, PRInt32 type, PRInt32 proto){	PRInt32 osfd;	PRFileDesc *fd;	PRInt32 tmp_domain = domain;	if (!_pr_initialized) _PR_ImplicitInitialization();	if (PR_AF_INET != domain			&& PR_AF_INET6 != domain#if defined(XP_UNIX)			&& PR_AF_LOCAL != domain#endif			) {		PR_SetError(PR_ADDRESS_NOT_SUPPORTED_ERROR, 0);		return NULL;	}#if defined(_PR_INET6_PROBE)	if (PR_AF_INET6 == domain) {		if (_pr_ipv6_is_present == PR_FALSE) 			domain = AF_INET;		else			domain = AF_INET6;	}#elif defined(_PR_INET6)	if (PR_AF_INET6 == domain)		domain = AF_INET6;#else	if (PR_AF_INET6 == domain)		domain = AF_INET;#endif	/* _PR_INET6 */	osfd = _PR_MD_SOCKET(domain, type, proto);	if (osfd == -1) {		return 0;	}	if (type == SOCK_STREAM)		fd = PR_AllocFileDesc(osfd, PR_GetTCPMethods());	else		fd = PR_AllocFileDesc(osfd, PR_GetUDPMethods());	/*	 * Make the sockets non-blocking	 */	if (fd != NULL) {		_PR_MD_MAKE_NONBLOCK(fd);		_PR_MD_INIT_FD_INHERITABLE(fd, PR_FALSE);#if defined(_PR_INET6_PROBE) || !defined(_PR_INET6)		/*		 * For platforms with no support for IPv6 		 * create layered socket for IPv4-mapped IPv6 addresses		 */		if (PR_AF_INET6 == tmp_domain && PR_AF_INET == domain) {			if (PR_FAILURE == _pr_push_ipv6toipv4_layer(fd)) {				PR_Close(fd);				fd = NULL;			}		}#endif	} else		_PR_MD_CLOSE_SOCKET(osfd);	return fd;}PR_IMPLEMENT(PRFileDesc *) PR_NewTCPSocket(void){	PRInt32 domain = AF_INET;	return PR_Socket(domain, SOCK_STREAM, 0);}PR_IMPLEMENT(PRFileDesc*) PR_NewUDPSocket(void){	PRInt32 domain = AF_INET;	return PR_Socket(domain, SOCK_DGRAM, 0);}PR_IMPLEMENT(PRFileDesc *) PR_OpenTCPSocket(PRIntn af){	return PR_Socket(af, SOCK_STREAM, 0);}PR_IMPLEMENT(PRFileDesc*) PR_OpenUDPSocket(PRIntn af){	return PR_Socket(af, SOCK_DGRAM, 0);}PR_IMPLEMENT(PRStatus) PR_NewTCPSocketPair(PRFileDesc *f[]){#ifdef XP_UNIX	PRInt32 rv, osfd[2];	if (!_pr_initialized) _PR_ImplicitInitialization();	rv = _PR_MD_SOCKETPAIR(AF_UNIX, SOCK_STREAM, 0, osfd);	if (rv == -1) {		return PR_FAILURE;	}	f[0] = PR_AllocFileDesc(osfd[0], PR_GetTCPMethods());	if (!f[0]) {		_PR_MD_CLOSE_SOCKET(osfd[0]);		_PR_MD_CLOSE_SOCKET(osfd[1]);		/* PR_AllocFileDesc() has invoked PR_SetError(). */		return PR_FAILURE;	}	f[1] = PR_AllocFileDesc(osfd[1], PR_GetTCPMethods());	if (!f[1]) {		PR_Close(f[0]);		_PR_MD_CLOSE_SOCKET(osfd[1]);		/* PR_AllocFileDesc() has invoked PR_SetError(). */		return PR_FAILURE;	}	_PR_MD_MAKE_NONBLOCK(f[0]);

⌨️ 快捷键说明

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