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

📄 socket.xs

📁 UNIX下perl实现代码
💻 XS
📖 第 1 页 / 共 2 页
字号:
#define PERL_NO_GET_CONTEXT#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#ifndef VMS# ifdef I_SYS_TYPES#  include <sys/types.h># endif# include <sys/socket.h># if defined(USE_SOCKS) && defined(I_SOCKS)#   include <socks.h># endif # ifdef MPE#  define PF_INET AF_INET#  define PF_UNIX AF_UNIX#  define SOCK_RAW 3# endif# ifdef I_SYS_UN#  include <sys/un.h># endif/* XXX Configure test for <netinet/in_systm.h needed XXX */# if defined(NeXT) || defined(__NeXT__)#  include <netinet/in_systm.h># endif# ifdef I_NETINET_IN#  include <netinet/in.h># endif# ifdef I_NETDB#  include <netdb.h># endif# ifdef I_ARPA_INET#  include <arpa/inet.h># endif# ifdef I_NETINET_TCP#  include <netinet/tcp.h># endif#else# include "sockadapt.h"#endif#ifdef I_SYSUIO# include <sys/uio.h>#endif#ifndef AF_NBS# undef PF_NBS#endif#ifndef AF_X25# undef PF_X25#endif#ifndef INADDR_NONE# define INADDR_NONE	0xffffffff#endif /* INADDR_NONE */#ifndef INADDR_BROADCAST# define INADDR_BROADCAST	0xffffffff#endif /* INADDR_BROADCAST */#ifndef INADDR_LOOPBACK# define INADDR_LOOPBACK         0x7F000001#endif /* INADDR_LOOPBACK */#ifndef HAS_INET_ATON/*  * Check whether "cp" is a valid ascii representation * of an Internet address and convert to a binary address. * Returns 1 if the address is valid, 0 if not. * This replaces inet_addr, the return value from which * cannot distinguish between failure and a local broadcast address. */static intmy_inet_aton(register const char *cp, struct in_addr *addr){	dTHX;	register U32 val;	register int base;	register char c;	int nparts;	const char *s;	unsigned int parts[4];	register unsigned int *pp = parts;	if (!cp)		return 0;	for (;;) {		/*		 * Collect number up to ``.''.		 * Values are specified as for C:		 * 0x=hex, 0=octal, other=decimal.		 */		val = 0; base = 10;		if (*cp == '0') {			if (*++cp == 'x' || *cp == 'X')				base = 16, cp++;			else				base = 8;		}		while ((c = *cp) != '\0') {			if (isDIGIT(c)) {				val = (val * base) + (c - '0');				cp++;				continue;			}			if (base == 16 && (s=strchr(PL_hexdigit,c))) {				val = (val << 4) + 					((s - PL_hexdigit) & 15);				cp++;				continue;			}			break;		}		if (*cp == '.') {			/*			 * Internet format:			 *	a.b.c.d			 *	a.b.c	(with c treated as 16-bits)			 *	a.b	(with b treated as 24 bits)			 */			if (pp >= parts + 3 || val > 0xff)				return 0;			*pp++ = val, cp++;		} else			break;	}	/*	 * Check for trailing characters.	 */	if (*cp && !isSPACE(*cp))		return 0;	/*	 * Concoct the address according to	 * the number of parts specified.	 */	nparts = pp - parts + 1;	/* force to an int for switch() */	switch (nparts) {	case 1:				/* a -- 32 bits */		break;	case 2:				/* a.b -- 8.24 bits */		if (val > 0xffffff)			return 0;		val |= parts[0] << 24;		break;	case 3:				/* a.b.c -- 8.8.16 bits */		if (val > 0xffff)			return 0;		val |= (parts[0] << 24) | (parts[1] << 16);		break;	case 4:				/* a.b.c.d -- 8.8.8.8 bits */		if (val > 0xff)			return 0;		val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);		break;	}	addr->s_addr = htonl(val);	return 1;}#undef inet_aton#define inet_aton my_inet_aton#endif /* ! HAS_INET_ATON */static intnot_here(char *s){    croak("Socket::%s not implemented on this architecture", s);    return -1;}static doubleconstant(char *name, int arg){    errno = 0;    switch (*name) {    case 'A':	if (strEQ(name, "AF_802"))#ifdef AF_802	    return AF_802;#else	    goto not_there;#endif	if (strEQ(name, "AF_APPLETALK"))#ifdef AF_APPLETALK	    return AF_APPLETALK;#else	    goto not_there;#endif	if (strEQ(name, "AF_CCITT"))#ifdef AF_CCITT	    return AF_CCITT;#else	    goto not_there;#endif	if (strEQ(name, "AF_CHAOS"))#ifdef AF_CHAOS	    return AF_CHAOS;#else	    goto not_there;#endif	if (strEQ(name, "AF_DATAKIT"))#ifdef AF_DATAKIT	    return AF_DATAKIT;#else	    goto not_there;#endif	if (strEQ(name, "AF_DECnet"))#ifdef AF_DECnet	    return AF_DECnet;#else	    goto not_there;#endif	if (strEQ(name, "AF_DLI"))#ifdef AF_DLI	    return AF_DLI;#else	    goto not_there;#endif	if (strEQ(name, "AF_ECMA"))#ifdef AF_ECMA	    return AF_ECMA;#else	    goto not_there;#endif	if (strEQ(name, "AF_GOSIP"))#ifdef AF_GOSIP	    return AF_GOSIP;#else	    goto not_there;#endif	if (strEQ(name, "AF_HYLINK"))#ifdef AF_HYLINK	    return AF_HYLINK;#else	    goto not_there;#endif	if (strEQ(name, "AF_IMPLINK"))#ifdef AF_IMPLINK	    return AF_IMPLINK;#else	    goto not_there;#endif	if (strEQ(name, "AF_INET"))#ifdef AF_INET	    return AF_INET;#else	    goto not_there;#endif	if (strEQ(name, "AF_LAT"))#ifdef AF_LAT	    return AF_LAT;#else	    goto not_there;#endif	if (strEQ(name, "AF_MAX"))#ifdef AF_MAX	    return AF_MAX;#else	    goto not_there;#endif	if (strEQ(name, "AF_NBS"))#ifdef AF_NBS	    return AF_NBS;#else	    goto not_there;#endif	if (strEQ(name, "AF_NIT"))#ifdef AF_NIT	    return AF_NIT;#else	    goto not_there;#endif	if (strEQ(name, "AF_NS"))#ifdef AF_NS	    return AF_NS;#else	    goto not_there;#endif	if (strEQ(name, "AF_OSI"))#ifdef AF_OSI	    return AF_OSI;#else	    goto not_there;#endif	if (strEQ(name, "AF_OSINET"))#ifdef AF_OSINET	    return AF_OSINET;#else	    goto not_there;#endif	if (strEQ(name, "AF_PUP"))#ifdef AF_PUP	    return AF_PUP;#else	    goto not_there;#endif	if (strEQ(name, "AF_SNA"))#ifdef AF_SNA	    return AF_SNA;#else	    goto not_there;#endif	if (strEQ(name, "AF_UNIX"))#ifdef AF_UNIX	    return AF_UNIX;#else	    goto not_there;#endif	if (strEQ(name, "AF_UNSPEC"))#ifdef AF_UNSPEC	    return AF_UNSPEC;#else	    goto not_there;#endif	if (strEQ(name, "AF_X25"))#ifdef AF_X25	    return AF_X25;#else	    goto not_there;#endif	break;    case 'B':	break;    case 'C':	break;    case 'D':	break;    case 'E':	break;    case 'F':	break;    case 'G':	break;    case 'H':	break;    case 'I':	if (strEQ(name, "IOV_MAX"))#ifdef IOV_MAX	    return IOV_MAX;#else	    goto not_there;#endif	if (strEQ(name, "IPPROTO_TCP"))#ifdef IPPROTO_TCP	    return IPPROTO_TCP;#else	    goto not_there;#endif	break;    case 'J':	break;    case 'K':	break;    case 'L':	break;    case 'M':	if (strEQ(name, "MSG_BCAST"))#ifdef MSG_BCAST	    return MSG_BCAST;#else	    goto not_there;#endif	if (strEQ(name, "MSG_CTLFLAGS"))#ifdef MSG_CTLFLAGS	    return MSG_CTLFLAGS;#else	    goto not_there;#endif	if (strEQ(name, "MSG_CTLIGNORE"))#ifdef MSG_CTLIGNORE	    return MSG_CTLIGNORE;#else	    goto not_there;#endif	if (strEQ(name, "MSG_CTRUNC"))#if defined(MSG_TRUNC) || defined(HAS_MSG_CTRUNC) /* might be an enum */	    return MSG_CTRUNC;#else	    goto not_there;#endif	if (strEQ(name, "MSG_DONTROUTE"))#if defined(MSG_DONTROUTE) || defined(HAS_MSG_DONTROUTE) /* might be an enum */	    return MSG_DONTROUTE;#else	    goto not_there;#endif	if (strEQ(name, "MSG_DONTWAIT"))#ifdef MSG_DONTWAIT	    return MSG_DONTWAIT;#else	    goto not_there;#endif	if (strEQ(name, "MSG_EOF"))#ifdef MSG_EOF	    return MSG_EOF;#else	    goto not_there;#endif	if (strEQ(name, "MSG_EOR"))#ifdef MSG_EOR	    return MSG_EOR;#else	    goto not_there;#endif	if (strEQ(name, "MSG_ERRQUEUE"))#ifdef MSG_ERRQUEUE	    return MSG_ERRQUEUE;#else	    goto not_there;#endif	if (strEQ(name, "MSG_FIN"))#ifdef MSG_FIN	    return MSG_FIN;#else	    goto not_there;#endif	if (strEQ(name, "MSG_MAXIOVLEN"))#ifdef MSG_MAXIOVLEN	    return MSG_MAXIOVLEN;#else	    goto not_there;#endif	if (strEQ(name, "MSG_MCAST"))#ifdef MSG_MCAST	    return MSG_MCAST;#else	    goto not_there;#endif	if (strEQ(name, "MSG_NOSIGNAL"))#ifdef MSG_NOSIGNAL	    return MSG_NOSIGNAL;#else	    goto not_there;#endif	if (strEQ(name, "MSG_OOB"))#if defined(MSG_OOB) || defined(HAS_MSG_OOB) /* might be an enum */	    return MSG_OOB;#else	    goto not_there;#endif	if (strEQ(name, "MSG_PEEK"))#if defined(MSG_PEEK) || defined(HAS_MSG_PEEK) /* might be an enum */	    return MSG_PEEK;#else	    goto not_there;#endif	if (strEQ(name, "MSG_PROXY"))#if defined(MSG_PROXY) || defined(HAS_MSG_PROXY) /* might be an enum */	    return MSG_PROXY;#else	    goto not_there;#endif	if (strEQ(name, "MSG_RST"))#ifdef MSG_RST	    return MSG_RST;#else	    goto not_there;#endif	if (strEQ(name, "MSG_SYN"))#ifdef MSG_SYN	    return MSG_SYN;#else	    goto not_there;#endif	if (strEQ(name, "MSG_TRUNC"))#ifdef MSG_TRUNC	    return MSG_TRUNC;#else	    goto not_there;#endif	if (strEQ(name, "MSG_WAITALL"))#ifdef MSG_WAITALL	    return MSG_WAITALL;#else	    goto not_there;#endif	break;    case 'N':	break;    case 'O':	break;    case 'P':	if (strEQ(name, "PF_802"))#ifdef PF_802	    return PF_802;#else	    goto not_there;#endif	if (strEQ(name, "PF_APPLETALK"))#ifdef PF_APPLETALK	    return PF_APPLETALK;#else	    goto not_there;#endif	if (strEQ(name, "PF_CCITT"))#ifdef PF_CCITT	    return PF_CCITT;#else	    goto not_there;#endif	if (strEQ(name, "PF_CHAOS"))#ifdef PF_CHAOS	    return PF_CHAOS;#else	    goto not_there;#endif	if (strEQ(name, "PF_DATAKIT"))#ifdef PF_DATAKIT	    return PF_DATAKIT;#else	    goto not_there;#endif	if (strEQ(name, "PF_DECnet"))#ifdef PF_DECnet	    return PF_DECnet;#else	    goto not_there;#endif	if (strEQ(name, "PF_DLI"))#ifdef PF_DLI	    return PF_DLI;#else	    goto not_there;#endif	if (strEQ(name, "PF_ECMA"))#ifdef PF_ECMA	    return PF_ECMA;#else	    goto not_there;#endif	if (strEQ(name, "PF_GOSIP"))#ifdef PF_GOSIP	    return PF_GOSIP;#else	    goto not_there;#endif	if (strEQ(name, "PF_HYLINK"))#ifdef PF_HYLINK	    return PF_HYLINK;#else	    goto not_there;#endif	if (strEQ(name, "PF_IMPLINK"))#ifdef PF_IMPLINK	    return PF_IMPLINK;#else	    goto not_there;#endif	if (strEQ(name, "PF_INET"))#ifdef PF_INET	    return PF_INET;#else	    goto not_there;

⌨️ 快捷键说明

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