mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 90c4dae08f
			
		
	
	
		90c4dae08f
		
	
	
	
	
		
			
			git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3106 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			338 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			338 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************
 | |
|   winsock2.c
 | |
| ***************************************************************/
 | |
| 
 | |
| //#define _WINSOCK2_C_DEBUG_MAIN_
 | |
| 
 | |
| #include <windows.h>
 | |
| #include "wince.h"
 | |
| #ifdef _WINSOCK2_C_DEBUG_MAIN_
 | |
|   #include <winsock.h>
 | |
| #endif
 | |
| 
 | |
| #ifndef _WINSOCK2_C_DEBUG_MAIN_
 | |
| struct  servent{
 | |
| 	char*  s_name;     /* official service name */
 | |
| 	char** s_aliases;  /* alias list */
 | |
| 	short  s_port;     /* port # */
 | |
| 	char*  s_proto;    /* protocol to use */
 | |
| };
 | |
| struct  protoent{
 | |
| 	char*  p_name;     /* official protocol name */
 | |
| 	char** p_aliases;  /* alias list */
 | |
| 	short  p_proto;    /* protocol # */
 | |
| };
 | |
| #endif
 | |
| 
 | |
| struct sproto{
 | |
| 	short num;
 | |
| 	char name[10];
 | |
| };
 | |
| struct sserv{
 | |
| 	short num;
 | |
| 	char protoname[10];
 | |
| 	char servname[20];
 | |
| };
 | |
| 
 | |
| static struct sproto _proto_table[11]={
 | |
| 	0,  "ip",
 | |
| 	1,  "icmp",
 | |
| 	3,  "ggp",
 | |
| 	6,  "tcp",
 | |
| 	8,  "egp",
 | |
| 	12, "pup",
 | |
| 	17, "udp",
 | |
| 	20, "hmp",
 | |
| 	22, "xns-idp",
 | |
| 	27, "rdp",
 | |
| 	66, "rvd",
 | |
| };
 | |
| 
 | |
| static struct sserv _serv_table[142]={
 | |
| 	7, "tcp", "echo",
 | |
| 	7, "udp", "echo",
 | |
| 	9, "tcp", "discard",
 | |
| 	9, "udp", "discard",
 | |
| 	11, "tcp", "systat",
 | |
| 	11, "udp", "systat",
 | |
| 	13, "tcp", "daytime",
 | |
| 	13, "udp", "daytime",
 | |
| 	15, "tcp", "netstat",
 | |
| 	17, "tcp", "qotd",
 | |
| 	17, "udp", "qotd",
 | |
| 	19, "tcp", "chargen",
 | |
| 	19, "udp", "chargen",
 | |
| 	20, "tcp", "ftp-data",
 | |
| 	21, "tcp", "ftp",
 | |
| 	23, "tcp", "telnet",
 | |
| 	25, "tcp", "smtp",
 | |
| 	37, "tcp", "time",
 | |
| 	37, "udp", "time",
 | |
| 	39, "udp", "rlp",
 | |
| 	42, "tcp", "name",
 | |
| 	42, "udp", "name",
 | |
| 	43, "tcp", "whois",
 | |
| 	53, "tcp", "domain",
 | |
| 	53, "udp", "domain",
 | |
| 	53, "tcp", "nameserver",
 | |
| 	53, "udp", "nameserver",
 | |
| 	57, "tcp", "mtp",
 | |
| 	67, "udp", "bootp",
 | |
| 	69, "udp", "tftp",
 | |
| 	77, "tcp", "rje",
 | |
| 	79, "tcp", "finger",
 | |
| 	87, "tcp", "link",
 | |
| 	95, "tcp", "supdup",
 | |
| 	101, "tcp", "hostnames",
 | |
| 	102, "tcp", "iso-tsap",
 | |
| 	103, "tcp", "dictionary",
 | |
| 	103, "tcp", "x400",
 | |
| 	104, "tcp", "x400-snd",
 | |
| 	105, "tcp", "csnet-ns",
 | |
| 	109, "tcp", "pop",
 | |
| 	109, "tcp", "pop2",
 | |
| 	110, "tcp", "pop3",
 | |
| 	111, "tcp", "portmap",
 | |
| 	111, "udp", "portmap",
 | |
| 	111, "tcp", "sunrpc",
 | |
| 	111, "udp", "sunrpc",
 | |
| 	113, "tcp", "auth",
 | |
| 	115, "tcp", "sftp",
 | |
| 	117, "tcp", "path",
 | |
| 	117, "tcp", "uucp-path",
 | |
| 	119, "tcp", "nntp",
 | |
| 	123, "udp", "ntp",
 | |
| 	137, "udp", "nbname",
 | |
| 	138, "udp", "nbdatagram",
 | |
| 	139, "tcp", "nbsession",
 | |
| 	144, "tcp", "NeWS",
 | |
| 	153, "tcp", "sgmp",
 | |
| 	158, "tcp", "tcprepo",
 | |
| 	161, "tcp", "snmp",
 | |
| 	162, "tcp", "snmp-trap",
 | |
| 	170, "tcp", "print-srv",
 | |
| 	175, "tcp", "vmnet",
 | |
| 	315, "udp", "load",
 | |
| 	400, "tcp", "vmnet0",
 | |
| 	500, "udp", "sytek",
 | |
| 	512, "udp", "biff",
 | |
| 	512, "tcp", "exec",
 | |
| 	513, "tcp", "login",
 | |
| 	513, "udp", "who",
 | |
| 	514, "tcp", "shell",
 | |
| 	514, "udp", "syslog",
 | |
| 	515, "tcp", "printer",
 | |
| 	517, "udp", "talk",
 | |
| 	518, "udp", "ntalk",
 | |
| 	520, "tcp", "efs",
 | |
| 	520, "udp", "route",
 | |
| 	525, "udp", "timed",
 | |
| 	526, "tcp", "tempo",
 | |
| 	530, "tcp", "courier",
 | |
| 	531, "tcp", "conference",
 | |
| 	531, "udp", "rvd-control",
 | |
| 	532, "tcp", "netnews",
 | |
| 	533, "udp", "netwall",
 | |
| 	540, "tcp", "uucp",
 | |
| 	543, "tcp", "klogin",
 | |
| 	544, "tcp", "kshell",
 | |
| 	550, "udp", "new-rwho",
 | |
| 	556, "tcp", "remotefs",
 | |
| 	560, "udp", "rmonitor",
 | |
| 	561, "udp", "monitor",
 | |
| 	600, "tcp", "garcon",
 | |
| 	601, "tcp", "maitrd",
 | |
| 	602, "tcp", "busboy",
 | |
| 	700, "udp", "acctmaster",
 | |
| 	701, "udp", "acctslave",
 | |
| 	702, "udp", "acct",
 | |
| 	703, "udp", "acctlogin",
 | |
| 	704, "udp", "acctprinter",
 | |
| 	704, "udp", "elcsd",
 | |
| 	705, "udp", "acctinfo",
 | |
| 	706, "udp", "acctslave2",
 | |
| 	707, "udp", "acctdisk",
 | |
| 	750, "tcp", "kerberos",
 | |
| 	750, "udp", "kerberos",
 | |
| 	751, "tcp", "kerberos_master",
 | |
| 	751, "udp", "kerberos_master",
 | |
| 	752, "udp", "passwd_server",
 | |
| 	753, "udp", "userreg_server",
 | |
| 	754, "tcp", "krb_prop",
 | |
| 	888, "tcp", "erlogin",
 | |
| 	1109, "tcp", "kpop",
 | |
| 	1167, "udp", "phone",
 | |
| 	1524, "tcp", "ingreslock",
 | |
| 	1666, "udp", "maze",
 | |
| 	2049, "udp", "nfs",
 | |
| 	2053, "tcp", "knetd",
 | |
| 	2105, "tcp", "eklogin",
 | |
| 	5555, "tcp", "rmt",
 | |
| 	5556, "tcp", "mtb",
 | |
| 	9535, "tcp", "man",
 | |
| 	9536, "tcp", "w",
 | |
| 	9537, "tcp", "mantst",
 | |
| 	10000, "tcp", "bnews",
 | |
| 	10000, "udp", "rscs0",
 | |
| 	10001, "tcp", "queue",
 | |
| 	10001, "udp", "rscs1",
 | |
| 	10002, "tcp", "poker",
 | |
| 	10002, "udp", "rscs2",
 | |
| 	10003, "tcp", "gateway",
 | |
| 	10003, "udp", "rscs3",
 | |
| 	10004, "tcp", "remp",
 | |
| 	10004, "udp", "rscs4",
 | |
| 	10005, "udp", "rscs5",
 | |
| 	10006, "udp", "rscs6",
 | |
| 	10007, "udp", "rscs7",
 | |
| 	10008, "udp", "rscs8",
 | |
| 	10009, "udp", "rscs9",
 | |
| 	10010, "udp", "rscsa",
 | |
| 	10011, "udp", "rscsb",
 | |
| 	10012, "tcp", "qmaster",
 | |
| 	10012, "udp", "qmaster",
 | |
| };
 | |
| 
 | |
| /* WinCE doesn't have /etc/protocols. */
 | |
| struct protoent* getprotobyname(const char* name)
 | |
| {
 | |
| 	static struct protoent pe;
 | |
| 	int i;
 | |
| 	int len = strlen(name);
 | |
| 
 | |
| 	memset( &pe, 0, sizeof(struct protoent) );
 | |
| 
 | |
| 	for(i=0; i<9; i++)
 | |
| 	{
 | |
| 		if( 0==strnicmp(_proto_table[i].name, name, len) )
 | |
| 		{
 | |
| 			pe.p_name = _proto_table[i].name;
 | |
| 			pe.p_proto= _proto_table[i].num;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return &pe;
 | |
| }
 | |
| 
 | |
| struct protoent* getprotobynumber(int proto)
 | |
| {
 | |
| 	static struct protoent pe={0};
 | |
| 	int i;
 | |
| 
 | |
| 	memset( &pe, 0, sizeof(struct protoent) );
 | |
| 
 | |
| 	for(i=0; i<9; i++)
 | |
| 	{
 | |
| 		if( proto == _proto_table[i].num )
 | |
| 		{
 | |
| 			pe.p_name = _proto_table[i].name;
 | |
| 			pe.p_proto= _proto_table[i].num;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return &pe;
 | |
| }
 | |
| 
 | |
| /* WinCE doesn't have /etc/services. */
 | |
| struct servent* getservbyname(const char* name,
 | |
|                               const char* proto)
 | |
| {
 | |
| 	static struct servent se;
 | |
| 	int i;
 | |
| 	int slen = strlen(name), plen = strlen(proto);
 | |
| 
 | |
| 	memset( &se, 0, sizeof(struct servent) );
 | |
| 
 | |
| 	if( proto==NULL ) return NULL;
 | |
| 	if( 0!=strnicmp( proto, "tcp", 3 ) &&
 | |
| 		0!=strnicmp( proto, "udp", 3 ) )
 | |
| 		return NULL;
 | |
| 
 | |
| 	for( i=0; i<142; i++ )
 | |
| 	{
 | |
| 		if( 0==strnicmp( name, _serv_table[i].servname, slen ) &&
 | |
| 			0==strnicmp( proto, _serv_table[i].protoname, plen ) )
 | |
| 		{
 | |
| 			char hc, lc;
 | |
| 			se.s_name = _serv_table[i].servname;
 | |
| 			se.s_proto= _serv_table[i].protoname;
 | |
| 			hc = (_serv_table[i].num&0xFF00)>>8;
 | |
| 			lc = _serv_table[i].num&0xFF;
 | |
| 			se.s_port = (lc<<8) + hc;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return &se;
 | |
| }
 | |
| 
 | |
| struct servent* getservbyport(int port, const char* proto)
 | |
| {
 | |
| 	static struct servent se;
 | |
| 	int i;
 | |
| 	int plen = strlen(proto);
 | |
| 	short sport;
 | |
| 	char  lc, hc;
 | |
| 
 | |
| 	hc = (port&0xFF00)>>8;
 | |
| 	lc = port&0xFF;
 | |
| 
 | |
| 	sport = (lc<<8) + hc;
 | |
| 
 | |
| 	memset( &se, 0, sizeof(struct servent) );
 | |
| 
 | |
| 	if( proto==NULL ) return NULL;
 | |
| 	if( 0!=strnicmp( proto, "tcp", 3 ) &&
 | |
| 		0!=strnicmp( proto, "udp", 3 ) )
 | |
| 		return NULL;
 | |
| 
 | |
| 	for( i=0; i<142; i++ )
 | |
| 	{
 | |
| 		if( sport == _serv_table[i].num &&
 | |
| 			0==strnicmp( proto, _serv_table[i].protoname, plen ) )
 | |
| 		{
 | |
| 			se.s_name = _serv_table[i].servname;
 | |
| 			se.s_proto= _serv_table[i].protoname;
 | |
| 			se.s_port = port;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return &se;
 | |
| }
 | |
| 
 | |
| 
 | |
| #ifdef _WINSOCK2_C_DEBUG_MAIN_
 | |
| 
 | |
| int main()
 | |
| {
 | |
| 	WORD wVersionRequested = MAKEWORD(1,1);
 | |
| 	WSADATA wsaData;
 | |
| 	int nErrorStatus;
 | |
| 	struct protoent pe1, pe2;
 | |
| 	struct servent se1, se2;
 | |
| 
 | |
| 	nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
 | |
| 	if(nErrorStatus != 0)
 | |
| 		return -1;
 | |
| 
 | |
| 	pe1 = *getprotobyname("UDP");
 | |
| 	pe2 = *_getprotobyname("UDP");
 | |
| 
 | |
| //	pe1 = *getprotobynumber(17);
 | |
| //	pe2 = *_getprotobynumber(17);
 | |
| 
 | |
| //	se1 = *getservbyname("gateway", "tcp");
 | |
| //	se2 = *_getservbyname("gateway", "tcp");
 | |
| 
 | |
| 	se1 = *getservbyport(0x1327, "tcp");
 | |
| 	se2 = *_getservbyport(0x1327, "tcp");
 | |
| 
 | |
| 	WSACleanup();
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| #endif
 |