зеркало из https://github.com/github/ruby.git
339 строки
6.8 KiB
C
339 строки
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
|