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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2011, 15:30   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию FTP-сервер, не удаётся создать соединение, MFC

Привет всем.
В программу нужно включить FTP-сервер. Готовый класс спионерил с Исходники.ру.

К классам, указанным по ссылке, добавил класс окна диалога, порожённый от CFTPEventSink:
Код:
class CBSServerDlg : public CDialog, CFTPEventSink
{
public:
	CBSServerDlg(CWnd* pParent = NULL);
	~CBSServerDlg();

	BOOL OnInitDialog();
	afx_msg void OnClose();

protected:
	virtual void OnFTPUserConnected(DWORD nThreadID, LPCTSTR lpszUser, LPCSTR lpszAddress){};
    virtual void OnFTPUserDisconnected(DWORD nThreadID, LPCTSTR lpszUser){};
    virtual void OnFTPStatusChange(int nType, LPCTSTR lpszText){};
    virtual void OnFTPReceivedBytesChange(int nBytes){};
    virtual void OnFTPSentBytesChange(int nBytes){};
    virtual void OnFTPStatisticChange(int nType, int nValue){};

private:
	DECLARE_MESSAGE_MAP();
};
И класс приложения (CBSServerApp).
В реализации приложения происходит создание объекта сервера и саомго приложения:
Код:
CFTPServer theServer;
CBSServerApp BSServerApp;
а так же инициализация системы сокетов и вызов диалогового окна:
Код:
BOOL CBSServerApp::InitInstance()
{
	if (!AfxSocketInit())
	{
		AfxMessageBox("Ошибка инициализации системы сокетов Windows");
		return FALSE;
	}

	CBSServerDlg BSServerDlg;
	m_pMainWnd = &BSServerDlg;
	BSServerDlg.DoModal();
	return FALSE;
}
При создании диалогового окна происходит инициализация и запуск сервера:
Код:
extern CFTPServer theServer;

BOOL CBSServerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	theServer.Initialize(this);
	theServer.SetPort(21);
	theServer.SetMaxUsers(10);
	if (theServer.Start())
		AfxMessageBox("FTP-сервер запущен");

	return TRUE;
}
Запуск проходит успешно, но при попытке обращения к серверу (из командной строки ftp 127.0.0.1) получается исключение.

Компилятор указывает в файл map_pp.cpp, сюда:
Код:
void* CMapPtrToPtr::GetValueAt(void* key) const
// find value (or return NULL -- NULL values not different as a result)
{
	ENSURE(this); //на этой строке выполнение обрывается

	if (m_pHashTable == NULL)
		return NULL;

	UINT nHash = HashKey(key) % m_nHashTableSize;

	// see if it exists
	CAssoc* pAssoc;
	for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext)
	{
		if (pAssoc->key == key)
			return pAssoc->value;
	}
	return NULL;
}
Эта функция вызывается при попытке выполнить функцию из ConnectThred.cpp
Код:
BOOL CConnectThread::InitInstance()
{
	try
	{
		// Attach the socket handle to a CSocket object.
		// This makes sure that the socket notifications are sent to this thread.
		m_ConnectSocket.Attach(m_hSocket); // здесь возникает исключение, дальше идём на except и закрываем соединение
//....
Помогите найти ошибку. Файлы, взятые из исходников я не менял.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 04.10.2011, 11:05   #2
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Проблема решилась. Похоже что при запуске нового потока нужно было инициализировать систему сокетов Windows:

Код:
BOOL CConnectThread::InitInstance()
{
	if (!AfxSocketInit())
	{
		AfxMessageBox("Ошибка инициализации системы сокетов Windows");
		return FALSE;
	}
	try
	{
		// Attach the socket handle to a CSocket object.
		// This makes sure that the socket notifications are sent to this thread.
		m_ConnectSocket.Attach(m_hSocket);
		m_ConnectSocket.m_pThread = this;
Правда я всё равно не понимаю, каким образом тогда работает ftp-сервер с исходников.ру (а ведь работает). Да и здесь ничего по этому поводу не указано. Если кому не лень, поясните пожалуйста.

Спасибо всем кто прочитал
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается установить FTP соединение через прокси DemonXT Работа с сетью в Delphi 12 12.11.2009 17:53
Помогите найти ошибку(VS, MFC, FTP) Pord Visual C++ 5 12.07.2009 17:08
Не удается наладить соединение ( MFC , CSocket ) DPRO Visual C++ 4 30.08.2008 09:29
соединение с сервером через FTP magpro Работа с сетью в Delphi 6 19.09.2007 13:56
Соединение с FTP через HTTP прокси с поддрержкой ФТП, как??? Relaxxx Работа с сетью в Delphi 3 22.06.2007 15:51