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

📄 socket.xs

📁 UNIX下perl实现代码
💻 XS
📖 第 1 页 / 共 2 页
字号:
#endif	if (strEQ(name, "PF_LAT"))#ifdef PF_LAT	    return PF_LAT;#else	    goto not_there;#endif	if (strEQ(name, "PF_MAX"))#ifdef PF_MAX	    return PF_MAX;#else	    goto not_there;#endif	if (strEQ(name, "PF_NBS"))#ifdef PF_NBS	    return PF_NBS;#else	    goto not_there;#endif	if (strEQ(name, "PF_NIT"))#ifdef PF_NIT	    return PF_NIT;#else	    goto not_there;#endif	if (strEQ(name, "PF_NS"))#ifdef PF_NS	    return PF_NS;#else	    goto not_there;#endif	if (strEQ(name, "PF_OSI"))#ifdef PF_OSI	    return PF_OSI;#else	    goto not_there;#endif	if (strEQ(name, "PF_OSINET"))#ifdef PF_OSINET	    return PF_OSINET;#else	    goto not_there;#endif	if (strEQ(name, "PF_PUP"))#ifdef PF_PUP	    return PF_PUP;#else	    goto not_there;#endif	if (strEQ(name, "PF_SNA"))#ifdef PF_SNA	    return PF_SNA;#else	    goto not_there;#endif	if (strEQ(name, "PF_UNIX"))#ifdef PF_UNIX	    return PF_UNIX;#else	    goto not_there;#endif	if (strEQ(name, "PF_UNSPEC"))#ifdef PF_UNSPEC	    return PF_UNSPEC;#else	    goto not_there;#endif	if (strEQ(name, "PF_X25"))#ifdef PF_X25	    return PF_X25;#else	    goto not_there;#endif	break;    case 'Q':	break;    case 'R':	break;    case 'S':	if (strEQ(name, "SCM_CONNECT"))#ifdef SCM_CONNECT	    return SCM_CONNECT;#else	    goto not_there;#endif	if (strEQ(name, "SCM_CREDENTIALS"))#ifdef SCM_CREDENTIALS	    return SCM_CREDENTIALS;#else	    goto not_there;#endif	if (strEQ(name, "SCM_CREDS"))#ifdef SCM_CREDS	    return SCM_CREDS;#else	    goto not_there;#endif	if (strEQ(name, "SCM_RIGHTS"))#if defined(SCM_RIGHTS) || defined(HAS_SCM_RIGHTS) /* might be an enum */	    return SCM_RIGHTS;#else	    goto not_there;#endif	if (strEQ(name, "SCM_TIMESTAMP"))#ifdef SCM_TIMESTAMP	    return SCM_TIMESTAMP;#else	    goto not_there;#endif	if (strEQ(name, "SHUT_RD"))#ifdef SHUT_RD	    return SHUT_RD;#else	    return 0;#endif	if (strEQ(name, "SHUT_RDWR"))#ifdef SHUT_RDWR	    return SHUT_RDWR;#else	    return 2;#endif	if (strEQ(name, "SHUT_WR"))#ifdef SHUT_WR	    return SHUT_WR;#else	    return 1;#endif	if (strEQ(name, "SOCK_DGRAM"))#ifdef SOCK_DGRAM	    return SOCK_DGRAM;#else	    goto not_there;#endif	if (strEQ(name, "SOCK_RAW"))#ifdef SOCK_RAW	    return SOCK_RAW;#else	    goto not_there;#endif	if (strEQ(name, "SOCK_RDM"))#ifdef SOCK_RDM	    return SOCK_RDM;#else	    goto not_there;#endif	if (strEQ(name, "SOCK_SEQPACKET"))#ifdef SOCK_SEQPACKET	    return SOCK_SEQPACKET;#else	    goto not_there;#endif	if (strEQ(name, "SOCK_STREAM"))#ifdef SOCK_STREAM	    return SOCK_STREAM;#else	    goto not_there;#endif	if (strEQ(name, "SOL_SOCKET"))#ifdef SOL_SOCKET	    return SOL_SOCKET;#else	    goto not_there;#endif	if (strEQ(name, "SOMAXCONN"))#ifdef SOMAXCONN	    return SOMAXCONN;#else	    goto not_there;#endif	if (strEQ(name, "SO_ACCEPTCONN"))#ifdef SO_ACCEPTCONN	    return SO_ACCEPTCONN;#else	    goto not_there;#endif	if (strEQ(name, "SO_BROADCAST"))#ifdef SO_BROADCAST	    return SO_BROADCAST;#else	    goto not_there;#endif	if (strEQ(name, "SO_DEBUG"))#ifdef SO_DEBUG	    return SO_DEBUG;#else	    goto not_there;#endif	if (strEQ(name, "SO_DONTLINGER"))#ifdef SO_DONTLINGER	    return SO_DONTLINGER;#else	    goto not_there;#endif	if (strEQ(name, "SO_DONTROUTE"))#ifdef SO_DONTROUTE	    return SO_DONTROUTE;#else	    goto not_there;#endif	if (strEQ(name, "SO_ERROR"))#ifdef SO_ERROR	    return SO_ERROR;#else	    goto not_there;#endif	if (strEQ(name, "SO_KEEPALIVE"))#ifdef SO_KEEPALIVE	    return SO_KEEPALIVE;#else	    goto not_there;#endif	if (strEQ(name, "SO_LINGER"))#ifdef SO_LINGER	    return SO_LINGER;#else	    goto not_there;#endif	if (strEQ(name, "SO_OOBINLINE"))#ifdef SO_OOBINLINE	    return SO_OOBINLINE;#else	    goto not_there;#endif	if (strEQ(name, "SO_RCVBUF"))#ifdef SO_RCVBUF	    return SO_RCVBUF;#else	    goto not_there;#endif	if (strEQ(name, "SO_RCVLOWAT"))#ifdef SO_RCVLOWAT	    return SO_RCVLOWAT;#else	    goto not_there;#endif	if (strEQ(name, "SO_RCVTIMEO"))#ifdef SO_RCVTIMEO	    return SO_RCVTIMEO;#else	    goto not_there;#endif	if (strEQ(name, "SO_REUSEADDR"))#ifdef SO_REUSEADDR	    return SO_REUSEADDR;#else	    goto not_there;#endif	if (strEQ(name, "SO_REUSEPORT"))#ifdef SO_REUSEPORT	    return SO_REUSEPORT;#else	    goto not_there;#endif	if (strEQ(name, "SO_SNDBUF"))#ifdef SO_SNDBUF	    return SO_SNDBUF;#else	    goto not_there;#endif	if (strEQ(name, "SO_SNDLOWAT"))#ifdef SO_SNDLOWAT	    return SO_SNDLOWAT;#else	    goto not_there;#endif	if (strEQ(name, "SO_SNDTIMEO"))#ifdef SO_SNDTIMEO	    return SO_SNDTIMEO;#else	    goto not_there;#endif	if (strEQ(name, "SO_TYPE"))#ifdef SO_TYPE	    return SO_TYPE;#else	    goto not_there;#endif	if (strEQ(name, "SO_USELOOPBACK"))#ifdef SO_USELOOPBACK	    return SO_USELOOPBACK;#else	    goto not_there;#endif	break;    case 'T':	if (strEQ(name, "TCP_KEEPALIVE"))#ifdef TCP_KEEPALIVE	    return TCP_KEEPALIVE;#else	    goto not_there;#endif	if (strEQ(name, "TCP_MAXRT"))#ifdef TCP_MAXRT	    return TCP_MAXRT;#else	    goto not_there;#endif	if (strEQ(name, "TCP_MAXSEG"))#ifdef TCP_MAXSEG	    return TCP_MAXSEG;#else	    goto not_there;#endif	if (strEQ(name, "TCP_NODELAY"))#ifdef TCP_NODELAY	    return TCP_NODELAY;#else	    goto not_there;#endif	if (strEQ(name, "TCP_STDURG"))#ifdef TCP_STDURG	    return TCP_STDURG;#else	    goto not_there;#endif	break;    case 'U':	if (strEQ(name, "UIO_MAXIOV"))#ifdef UIO_MAXIOV	    return UIO_MAXIOV;#else	    goto not_there;#endif	break;    case 'V':	break;    case 'W':	break;    case 'X':	break;    case 'Y':	break;    case 'Z':	break;    }    errno = EINVAL;    return 0;not_there:    errno = ENOENT;    return 0;}MODULE = Socket		PACKAGE = Socketdoubleconstant(name,arg)	char *		name	int		argvoidinet_aton(host)	char *	host	CODE:	{	struct in_addr ip_address;	struct hostent * phe;	int ok = inet_aton(host, &ip_address);	if (!ok && (phe = gethostbyname(host))) {		Copy( phe->h_addr, &ip_address, phe->h_length, char );		ok = 1;	}	ST(0) = sv_newmortal();	if (ok) {		sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );	}	}voidinet_ntoa(ip_address_sv)	SV *	ip_address_sv	CODE:	{	STRLEN addrlen;	struct in_addr addr;	char * addr_str;	char * ip_address = SvPV(ip_address_sv,addrlen);	if (addrlen != sizeof(addr)) {	    croak("Bad arg length for %s, length is %d, should be %d",			"Socket::inet_ntoa",			addrlen, sizeof(addr));	}	Copy( ip_address, &addr, sizeof addr, char );	addr_str = inet_ntoa(addr);	ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));	}voidpack_sockaddr_un(pathname)	char *	pathname	CODE:	{#ifdef I_SYS_UN	struct sockaddr_un sun_ad; /* fear using sun */	STRLEN len;	Zero( &sun_ad, sizeof sun_ad, char );	sun_ad.sun_family = AF_UNIX;	len = strlen(pathname);	if (len > sizeof(sun_ad.sun_path))	    len = sizeof(sun_ad.sun_path);#  ifdef OS2	/* Name should start with \socket\ and contain backslashes! */	{	    int off;	    char *s, *e;	    if (pathname[0] != '/' && pathname[0] != '\\')		croak("Relative UNIX domain socket name '%s' unsupported", pathname);	    else if (len < 8 		     || pathname[7] != '/' && pathname[7] != '\\'		     || !strnicmp(pathname + 1, "socket", 6))		off = 7;	    else		off = 0;		/* Preserve names starting with \socket\ */	    Copy( "\\socket", sun_ad.sun_path, off, char);	    Copy( pathname, sun_ad.sun_path + off, len, char );	    s = sun_ad.sun_path + off - 1;	    e = s + len + 1;	    while (++s < e)		if (*s = '/')		    *s = '\\';	}#  else	/* !( defined OS2 ) */ 	Copy( pathname, sun_ad.sun_path, len, char );#  endif	ST(0) = sv_2mortal(newSVpvn((char *)&sun_ad, sizeof sun_ad));#else	ST(0) = (SV *) not_here("pack_sockaddr_un");#endif		}voidunpack_sockaddr_un(sun_sv)	SV *	sun_sv	CODE:	{#ifdef I_SYS_UN	struct sockaddr_un addr;	STRLEN sockaddrlen;	char * sun_ad = SvPV(sun_sv,sockaddrlen);	char * e;#   ifndef __linux__	/* On Linux sockaddrlen on sockets returned by accept, recvfrom,	   getpeername and getsockname is not equal to sizeof(addr). */	if (sockaddrlen != sizeof(addr)) {	    croak("Bad arg length for %s, length is %d, should be %d",			"Socket::unpack_sockaddr_un",			sockaddrlen, sizeof(addr));	}#   endif	Copy( sun_ad, &addr, sizeof addr, char );	if ( addr.sun_family != AF_UNIX ) {	    croak("Bad address family for %s, got %d, should be %d",			"Socket::unpack_sockaddr_un",			addr.sun_family,			AF_UNIX);	}	e = addr.sun_path;	while (*e && e < addr.sun_path + sizeof addr.sun_path)	    ++e;	ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path));#else	ST(0) = (SV *) not_here("unpack_sockaddr_un");#endif	}voidpack_sockaddr_in(port,ip_address)	unsigned short	port	char *	ip_address	CODE:	{	struct sockaddr_in sin;	Zero( &sin, sizeof sin, char );	sin.sin_family = AF_INET;	sin.sin_port = htons(port);	Copy( ip_address, &sin.sin_addr, sizeof sin.sin_addr, char );	ST(0) = sv_2mortal(newSVpvn((char *)&sin, sizeof sin));	}voidunpack_sockaddr_in(sin_sv)	SV *	sin_sv	PPCODE:	{	STRLEN sockaddrlen;	struct sockaddr_in addr;	unsigned short	port;	struct in_addr	ip_address;	char *	sin = SvPV(sin_sv,sockaddrlen);	if (sockaddrlen != sizeof(addr)) {	    croak("Bad arg length for %s, length is %d, should be %d",			"Socket::unpack_sockaddr_in",			sockaddrlen, sizeof(addr));	}	Copy( sin, &addr,sizeof addr, char );	if ( addr.sin_family != AF_INET ) {	    croak("Bad address family for %s, got %d, should be %d",			"Socket::unpack_sockaddr_in",			addr.sin_family,			AF_INET);	} 	port = ntohs(addr.sin_port);	ip_address = addr.sin_addr;	EXTEND(SP, 2);	PUSHs(sv_2mortal(newSViv((IV) port)));	PUSHs(sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address)));	}voidINADDR_ANY()	CODE:	{	struct in_addr	ip_address;	ip_address.s_addr = htonl(INADDR_ANY);	ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address ));	}voidINADDR_LOOPBACK()	CODE:	{	struct in_addr	ip_address;	ip_address.s_addr = htonl(INADDR_LOOPBACK);	ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));	}voidINADDR_NONE()	CODE:	{	struct in_addr	ip_address;	ip_address.s_addr = htonl(INADDR_NONE);	ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));	}voidINADDR_BROADCAST()	CODE:	{	struct in_addr	ip_address;	ip_address.s_addr = htonl(INADDR_BROADCAST);	ST(0) = sv_2mortal(newSVpvn((char *)&ip_address,sizeof ip_address));	}

⌨️ 快捷键说明

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