mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	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
 |