int kickoff_telnetd(void)
{
printf("Attempting to start Simple TelnetD\n");
SetConsoleCtrlHandler(Cleanup, 1);
if (!StartSocketInterface())
ErrorExit("Unable to start socket interface\n");
CreateSocket();
while(!bShutdown) {
WaitForConnect();
}
WSACleanup();
return 0;
}
/* Cleanup */
static BOOL WINAPI Cleanup(DWORD dwControlType)
{
if (bSocketInterfaceInitialised) {
telnetd_printf("Cleanup...\n");
WSACleanup();
}
return 0;
}
/* StartSocketInterface */
static BOOLEAN StartSocketInterface(void)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
telnetd_printf("requested winsock version not supported\n");
return 0;
}
bSocketInterfaceInitialised = 1; /* for ErrorExit function */
if ( wsaData.wVersion != wVersionRequested)
ErrorExit("requested winsock version not supported\n");
telnetd_printf("TelnetD, using %s\n", wsaData.szDescription);
return 1;
}
/* CreateSocket */
static void CreateSocket(void)
{
struct sockaddr_in sa;
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0)
ErrorExit("Cannot create socket");
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = htons(TELNET_PORT);
if (bind(sock, (struct sockaddr*) &sa, sizeof(sa)) != 0)
ErrorExit("Cannot bind address to socket");
}
/* WaitForConnect */
static void WaitForConnect(void)
{
struct sockaddr_in sa;
int new_sock;
if (listen(sock, 1) < 0)
ErrorExit("Cannot listen on socket");
if ((new_sock = accept(sock, (struct sockaddr*) &sa, NULL)) < 0) {
fprintf(stderr, "Failed to accept incoming call\n");
} else {
telnetd_printf("user connected on socket %d, port %d, address %lx\n", new_sock,
htons(sa.sin_port), sa.sin_addr.s_addr);
UserLogin(new_sock);
}
}
/* Function: UserLogin */
static void UserLogin(int client_socket)
{
HANDLE threadHandle;
client_t *client = (client_t *)malloc(sizeof(client_t));
if (client == NULL)
ErrorExit("failed to allocate memory for client");
client->socket = client_socket;
threadHandle = CreateThread(NULL, 0, UserLoginThread, client, 0, NULL);
if (threadHandle == NULL)
free(client);
else
CloseHandle(threadHandle);
}
/* Function: UserLoginThread */
static DWORD WINAPI UserLoginThread(LPVOID data)
{
client_t *client = (client_t *) data;
char welcome[256];
char hostname[64] = "Unknown";
char *pwdPrompt = "\r\npass:";
//char *logonPrompt = "\r\nLogin OK, please wait...";
//char *byebye = "\r\nWrong! bye bye...\r\n";
char userID[USERID_SIZE];
char password[USERID_SIZE];
int received;
char *terminator;
if (DoTelnetHandshake(client->socket)) {
closesocket(client->socket);
free(client);
return 0;
}
gethostname
Windows 实现telnet协议
最新推荐文章于 2024-08-26 16:57:26 发布