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