📄 webpage.c
字号:
goto FATAL;
}
// Allocate space for the CGI post data
postdata = (char *)mmBulkAlloc(ContentLength+1);
if( !postdata )
goto FATAL;
// Read in the post data from the socket
bytes = recv(htmlSock, postdata, ContentLength, MSG_WAITALL);
if( bytes < 1 )
goto FATAL;
// Setup to parse the post data
parseIndex = 0;
postdata[ContentLength] = '\0';
// Read until we've read the item "ip"
do {
name = cgiParseVars( postdata, &parseIndex );
value = cgiParseVars( postdata, &parseIndex );
} while( strcmp("ip", name ) && parseIndex != -1 );
CHECKARGS:
// Now check the value of "ip"
if (strcmp("ipinfo", value) == 0)
CreateIPUse(htmlSock);
else if (strcmp("sockets", value) == 0)
CreatehtmlSockets(htmlSock);
else if (strcmp("route", value) == 0)
CreateRoute(htmlSock);
else
http405(htmlSock);
FATAL:
// Free the data we've allocated
if( postdata )
mmBulkFree(postdata);
// We always leave the socket open
return( 1 );
}
void CreateIPUse(SOCKET htmlSock)
{
IPN myIP;
IPN yourIP;
char pszmyIP[32];
char pszyourIP[32];
struct sockaddr_in Info;
int InfoLength;
char tmpBuf[128];
HOSTENT *dnsInfo;
char htmlbuf[MAX_RESPONSE_SIZE];
int rc;
InfoLength = sizeof(Info);
getsockname( htmlSock, &Info, &InfoLength );
myIP = Info.sin_addr.s_addr;
NtIPN2Str( myIP, pszmyIP );
InfoLength = sizeof(Info);
getpeername( htmlSock, &Info, &InfoLength );
yourIP = Info.sin_addr.s_addr;
NtIPN2Str( yourIP, pszyourIP );
httpSendStatusLine(htmlSock, HTTP_OK, CONTENT_TYPE_HTML);
// CRLF before entity
html( CRLF );
html(pstr_HTML_START);
html(pstr_TI_START);
html("<h1>IP Address Information</h1>\r\n");
html(pstr_DIVIDER);
html(pstr_TABLE_START);
html(pstr_ROW_START);
sprintf(htmlbuf,"<td>HTTP Server IP Address</td><td>%s</td>", pszmyIP);
html(htmlbuf);
html(pstr_ROW_END);
html(pstr_ROW_START);
html("<td>HTTP Server Hostname</td>");
rc = DNSGetHostByAddr( myIP, tmpBuf, sizeof(tmpBuf) );
if( rc )
sprintf(htmlbuf, "<td>%s</td>", DNSErrorStr(rc) );
else
{
dnsInfo = (HOSTENT*) tmpBuf;
sprintf(htmlbuf, "<td>%s</td>", dnsInfo->h_name);
}
html(htmlbuf);
html(pstr_ROW_END);
html(pstr_ROW_START);
sprintf(htmlbuf, "<td>Your IP Address</td><td>%s</td>", pszyourIP);
html(htmlbuf);
html(pstr_ROW_END);
html(pstr_ROW_START);
html("<td>Your Hostname</td>");
rc = DNSGetHostByAddr( yourIP, tmpBuf, sizeof(tmpBuf) );
if( rc )
sprintf(htmlbuf, "<td>%s</td>", DNSErrorStr(rc) );
else
{
dnsInfo = (HOSTENT*) tmpBuf;
sprintf(htmlbuf, "<td>%s</td>", dnsInfo->h_name);
}
html(htmlbuf);
html(pstr_ROW_END);
html(pstr_TABLE_END);
html(pstr_DIVIDER);
html(pstr_LINK_MAIN);
html(pstr_TI_END);
html(pstr_HTML_END);
}
static void DumphtmlSockets( SOCKET htmlSock, uint htmlSockProt );
void CreatehtmlSockets(SOCKET htmlSock)
{
httpSendStatusLine(htmlSock, HTTP_OK, CONTENT_TYPE_HTML);
// CRLF before entity
html( CRLF );
html(pstr_HTML_START);
html(pstr_TI_START);
html("<h1>TCP/IP Socket State Information</h1>\r\n");
html(pstr_DIVIDER);
html("<h2>TCP Sockets</h2>\r\n");
DumphtmlSockets( htmlSock, SOCKPROT_TCP );
html(pstr_DIVIDER);
html("<h2>UDP Sockets</h2>\r\n");
DumphtmlSockets( htmlSock, SOCKPROT_UDP );
html(pstr_DIVIDER);
html(pstr_LINK_MAIN);
html(pstr_TI_END);
html(pstr_HTML_END);
}
static const char *States[] = { "CLOSED","LISTEN","SYNSENT","SYNRCVD",
"ESTABLISHED","CLOSEWAIT","FINWAIT1","CLOSING",
"LASTACK","FINWAIT2","TIMEWAIT" };
static void DumphtmlSockets( SOCKET htmlSock, uint htmlSockProt )
{
UINT8 *pBuf;
int Entries,i;
SOCKPCB *ppcb;
char str[32];
char htmlbuf[MAX_RESPONSE_SIZE];
pBuf = mmBulkAlloc(2048);
if( !pBuf )
return;
// Use llEnter / llExit since we're calling into the stack
llEnter();
Entries = SockGetPcb( htmlSockProt, 2048, pBuf );
llExit();
html(pstr_TABLE_START);
html(pstr_ROW_START);
html("<td>Local IP</td><td>LPort</td>");
html("<td>Foreign IP</td><td>FPort</td>\r\n");
if( htmlSockProt == SOCKPROT_TCP )
html("<td>State</td>\r\n");
html(pstr_ROW_END);
for(i=0; i<Entries; i++)
{
ppcb = (SOCKPCB *)(pBuf+(i*sizeof(SOCKPCB)));
html(pstr_ROW_START);
NtIPN2Str( ppcb->IPAddrLocal, str );
sprintf(htmlbuf, "<td>%-15s</td><td>%-5u</td>", str, htons(ppcb->PortLocal) );
html(htmlbuf);
NtIPN2Str( ppcb->IPAddrForeign, str );
sprintf(htmlbuf, "<td>%-15s</td><td>%-5u</td>\r\n", str, htons(ppcb->PortForeign) );
html(htmlbuf);
if( htmlSockProt == SOCKPROT_TCP )
{
sprintf(htmlbuf,"<td>%s</td>\r\n",States[ppcb->State]);
html(htmlbuf);
}
html(pstr_ROW_END);
}
html(pstr_TABLE_END);
mmBulkFree( pBuf );
}
void CreateRoute(SOCKET htmlSock)
{
HANDLE hRt,hIF,hLLI;
uint wFlags,IFType,IFIdx;
UINT32 IPAddr,IPMask;
char str[32];
UINT8 MacAddr[6];
char htmlbuf[MAX_RESPONSE_SIZE];
httpSendStatusLine(htmlSock, HTTP_OK, CONTENT_TYPE_HTML);
// CRLF before entity
html( CRLF );
html(pstr_HTML_START);
html(pstr_TI_START);
html("<h1>TCP/IP Current Route Table</h1>\r\n");
html(pstr_DIVIDER);
// Start walking the tree
llEnter();
hRt = RtWalkBegin();
llExit();
html(pstr_TABLE_START);
html(pstr_ROW_START);
html("<td>Address</td><td>Subnet Mask</td>");
html("<td>Flags</td><td>Gateway</td>\r\n");
html(pstr_ROW_END);
// While there are routes, print the route information
while( hRt )
{
html(pstr_ROW_START);
// Get the IP addess and IP mask and flags of the route
llEnter();
IPAddr = RtGetIPAddr( hRt );
IPMask = RtGetIPMask( hRt );
wFlags = RtGetFlags( hRt );
hIF = RtGetIF( hRt );
if( hIF )
{
IFType = IFGetType(hIF);
IFIdx = IFGetIndex(hIF);
}
else
IFType = IFIdx = 0;
llExit();
// Print address and mask
NtIPN2Str( IPAddr, str );
sprintf(htmlbuf, "<td>%-15s</td>", str );
html(htmlbuf);
NtIPN2Str( IPMask, str );
sprintf(htmlbuf, "<td>%-15s</td>", str );
html(htmlbuf);
// Decode flags
if( wFlags & FLG_RTE_UP )
strcpy(str,"U");
else
strcpy(str," ");
if( wFlags & FLG_RTE_GATEWAY )
strcat(str,"G");
else
strcat(str," ");
if( wFlags & FLG_RTE_HOST )
strcat(str,"H");
else
strcat(str," ");
if( wFlags & FLG_RTE_STATIC )
strcat(str,"S");
else
strcat(str," ");
if( wFlags & FLG_RTE_CLONING )
strcat(str,"C");
else
strcat(str," ");
if( wFlags & FLG_RTE_IFLOCAL )
strcat(str,"L");
else
strcat(str," ");
sprintf(htmlbuf, "<td>%s</td>", str );
html(htmlbuf);
// If the route is a gateway, print the gateway IP address as well
if( wFlags & FLG_RTE_GATEWAY )
{
llEnter();
IPAddr = RtGetGateIP( hRt );
llExit();
NtIPN2Str( IPAddr, str );
sprintf(htmlbuf, "<td>%-15s</td>", str );
html(htmlbuf);
}
// Else if non-local host route on Ethernet, print ARP entry
else if( IFType == HTYPE_ETH &&
(wFlags&FLG_RTE_HOST) && !(wFlags&FLG_RTE_IFLOCAL) )
{
// The stack has a MAC address if it has an LLI (link-layer info)
// object, and LLIGetMacAddr returns 1.
llEnter();
if( !(hLLI = RtGetLLI( hRt )) || !LLIGetMacAddr( hLLI, MacAddr, 6 ) )
llExit();
else
{
llExit();
sprintf( htmlbuf,"<td>%02X:%02X:%02X:%02X:%02X:%02X</td>",
MacAddr[0], MacAddr[1], MacAddr[2],
MacAddr[3], MacAddr[4], MacAddr[5] );
html(htmlbuf);
}
}
// Else just print out the interface
else if( IFIdx )
{
if( wFlags & FLG_RTE_IFLOCAL )
{
sprintf( htmlbuf,"<td>local (if-%d)</td>", IFIdx );
html(htmlbuf);
}
else
{
sprintf( htmlbuf,"<td>if-%d</td>", IFIdx );
html(htmlbuf);
}
}
html(pstr_ROW_END);
llEnter();
hRt = RtWalkNext( hRt );
llExit();
}
llEnter();
RtWalkEnd( 0 );
llExit();
html(pstr_TABLE_END);
html(pstr_DIVIDER);
html(pstr_LINK_MAIN);
html(pstr_TI_END);
html(pstr_HTML_END);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -