📄 socket.xs
字号:
#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 + -