Gokulnath007 Ответов: 4

Как создать поток в приложении чата


Как создать поток для сервера во время прослушивания.. для того, чтобы принимать больше клиентов.. Основная концепция заключается в том, чтобы общаться с другим клиентом с помощью сервера.. Другими словами, сервер должен принимать много клиентов... Как это сделать с помощью нити????


// ServerClass.cpp : implementation file
//

#include "stdafx.h"
#include "newsocketserver.h"
#include "ServerClass.h"
#include "MySocket.h"
#include "Npapi.h"

// CServerClass dialog
//
//UINT AcceptThread(LPVOID lp)
//{
//
//}
UINT ServerListenThread(LPVOID pParam)
{
	CServerClass *pWnd=(CServerClass *)pParam;
	while(1)
	{		
		pWnd->OnBnClickedBlisten();
	}
	
	return 0;
}

IMPLEMENT_DYNAMIC(CServerClass, CDialog)

CServerClass::CServerClass(CWnd* pParent /*=NULL*/)
	: CDialog(CServerClass::IDD, pParent)
{
	
}

CServerClass::~CServerClass()
{
}


void CServerClass::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_BLISTEN, m_blis);
	DDX_Text(pDX, IDC_EMESS, m_emessage);
	DDX_Control(pDX, IDC_LSENT, m_lsent);
}


BEGIN_MESSAGE_MAP(CServerClass, CDialog)
	ON_BN_CLICKED(IDC_BCLOSE, &CServerClass::OnBnClickedBclose)
	//ON_BN_CLICKED(IDC_BLISTEN, &CServerClass::OnBnClickedBlisten)
	ON_BN_CLICKED(IDC_BSEND, &CServerClass::OnBnClickedBsend)
	ON_MESSAGE(WM_THREAD_MSG,OnThreadMsg)
	//ON_BN_CLICKED(IDC_RADIO1, &CServerClass::OnRadio)
	//ON_BN_CLICKED(IDC_RADIO2, &CServerClass::OnRadio)	
END_MESSAGE_MAP()
BOOL CServerClass::OnInitDialog()
{
	for (int n = 0 ; n < 10 ; n++)
	{
		h=CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)ServerListenThread,0,0,NULL);
	}	
	CDialog::OnInitDialog();
	UpdateData(FALSE);
	m_connect.SetParent(this);
	m_client.SetParent(this);
	CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);
	//OnRadio();
	gethostname(host,201); 
	CString str;
	str=host;	
	bClient =false;
	if(!bClient)
	{
		k=1;
		OnRadio(false);
		OnBnClickedBlisten();
	}
	else
	{
		k=0;
		OnRadio(true);
		OnBnClickedConnect();
		
	}
	SetDefID(IDC_BSEND);
//	AfxBeginThread(ServerListenThread,(LPVOID)this);	
	//SetTimer(100, 6000, NULL);
	return FALSE;
}



// CServerClass message handlers
void CServerClass::OnBnClickedBclose()
{
	// TODO: Add your control notification handler code here
	 
	DestroyWindow();
}

void CServerClass::OnBnClickedBlisten()
{
	GetDlgItem(IDC_BLISTEN)->EnableWindow(FALSE);
	GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);
	GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);
	GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
	GetDlgItem(IDC_EMESS)->EnableWindow(FALSE);	
	m_connect.Create(2500);
	m_connect.Listen();
}

void CServerClass::OnBnClickedConnect()
{
	GetDlgItem(IDC_BLISTEN)->EnableWindow(FALSE);
	GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE);
	GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);
	GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
	GetDlgItem(IDC_EMESS)->EnableWindow(FALSE);	
	m_client.Create();
	m_client.Connect(_T("192.168.1.132"),2500);
}

void CServerClass::OnAccept()
{
	sockaddr_in from;
	int fromsize=sizeof(from);
	m_connect.Accept(m_client,(struct sockaddr *)&from,&fromsize);

	if(m_connect!=INVALID_SOCKET)
	{
		int nValue=1;
		this->PostMessage(WM_THREAD_MSG,nValue);
	}
	
	//m_connect.Accept(m_client);
	

	GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
	GetDlgItem(IDC_EMESS)->EnableWindow(TRUE);
	GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);	
}
LRESULT CServerClass::OnThreadMsg(WPARAM wParam,LPARAM lParam)
{
	
	return 0;
}
void CServerClass::OnBnClickedBsend()
{
	// TODO: Add your control notification handler code here	
	int iLen;
	int iSent;
	UpdateData(TRUE);
	gethostname(host,201);
	CString str,user; 
	str=host;
	TCHAR acUserName[100];
	DWORD nUserName = sizeof(acUserName);
    GetUserName(acUserName, &nUserName);
	tempuser=acUserName;
	if(m_emessage!="")
	{
		iLen=m_emessage.GetLength();
		iSent=m_client.Send(m_emessage,iLen*2);
		if(iSent==SOCKET_ERROR)
		{
		}
		else
		{
			int checked=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO2);
			if(checked==IDC_RADIO1)
			{
				m_lsent.AddString(_T("me:")+m_emessage);
				
			}
			else if(checked==IDC_RADIO2)
			{
				m_lsent.AddString(_T("me:")+m_emessage);
				
			}
			m_emessage.Empty();
			UpdateData(FALSE);
		}
	}
}
void CServerClass::OnClose() 
{
	
}

void CServerClass::OnSend()
{
	
}

void CServerClass::OnReceive()
{
	CString str,user;
	gethostname(host,201);
	str=host;
	TCHAR acUserName[100];
	DWORD nUserName = sizeof(acUserName);
    GetUserName(acUserName, &nUserName);
	user=acUserName;
	WCHAR *pBuff=new WCHAR[100];
	int iBuffSize=99;
	int Rcvd;
	Rcvd = m_client.Receive(pBuff,100);

	
	struct sockaddr_in peer;
	int peer_len;
	peer_len = sizeof(peer);
    
	if (getpeername(m_client, (struct sockaddr*)&peer, &peer_len) == -1) {
	  perror("getpeername() failed");
	  return;
	}
      
   struct hostent *remoteHost;
   remoteHost = gethostbyaddr((char *) &peer.sin_addr, 4, AF_INET);
	CString strIp;
	strIp = remoteHost->h_name;	

	if(Rcvd==SOCKET_ERROR)
	{ 
	}
	else											
	{		
		pBuff[Rcvd]=NULL;
		CString lvstrRecev(pBuff);
		int nLength;
		nLength = lvstrRecev.GetLength();
		CString strTemp;
		for(int i=0;i<nLength/2;i++)
		{
			strTemp += lvstrRecev.GetAt(i);
		}
		
		if(k==1)
		{
			
			m_lsent.AddString(strIp+_T(":")+strTemp);
			
			user="";
		}
		else if(k==0)
		{
			TCHAR acUserName[100];
			DWORD nUserName = sizeof(acUserName);
			GetUserName(acUserName,&nUserName);
			tempuser=acUserName;
			m_lsent.AddString(strIp+_T(":")+strTemp);
		}
		
		UpdateData(FALSE);
	}
}

void CServerClass::OnRadio(bool bClient)
{
	if(!bClient)
	{
		m_blis.SetWindowText(_T("LISTEN"));		
	}
	else
	{
		m_blis.SetWindowText(_T("CONNECT"));
	}
}

void CServerClass::OnConnect()
{
	GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
	GetDlgItem(IDC_EMESS)->EnableWindow(TRUE);
	GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);	
}



ЕСТЬ ЛИ ТАМ КТО-НИБУДЬ ДЛЯ МЕНЯ???

Kozlov_Sergey

Вы не должны создавать 10 потоков. Один поток должен быть создан.

Dalek Dave

Отредактировано для блока кода, но вам может понадобиться проверить то, что вы написали.

4 Ответов

Рейтинг:
28

Kozlov_Sergey

Вы должны создать поток прослушивания. Когда клиент подключен, в потоке прослушивания вы должны создать текущий клиентский поток связи и ждать следующего клиентского соединения.
Я так думаю.


Gokulnath007

да... как создать эту нить прослушивания..

Kozlov_Sergey

Создает нить.


uintptr_t функции(
пустота( *start_address )( пустота * ),
неподписанные stack_size,
пустота *список_аргументов
);
uintptr_t помощью _beginthreadex(
пустота *безопасность,
неподписанные stack_size,
без знака ( *start_address )( пустота * ),
пустота *список_аргументов,
неподписанные задайте,
без знака *thrdaddr
);

Kozlov_Sergey

Вы должны разработать свой коммуникационный протокол:
сервер: wait request Client: отправить запрос на получение данных (что-то вроде в файле get протокола http file1.cpp)
сервер: отправить файл клиент: получить файл
сервер: ожидание запроса клиент: отправить запрос на отправку сообщения клиенту outher (отправить сообщение "Привет всем!")
сервер: ожидание запроса

Gokulnath007

Как это возможно в диалоговом приложении. в vc++ MFC

Kozlov_Sergey

Сначала вы создаете поток прослушивания.
Он использует цикл while(1).
Затем вы создаете коммуникационный поток, когда клиент подключен.
Он использовал ваш протокол. В цикле while(1) он ожидает запросов.
Вы можете дать указатель на ваш диалоговый класс любому потоку, чтобы они могли вызывать ваши диалоговые функции.
В чем разница диалог или не диалог?

Dalek Dave

хороший ответ.

Gokulnath007

А как насчет AfxBeginThread???

Kozlov_Sergey

AfxBeginThread также можно использовать, если вы используете MFC.

Рейтинг:
0

Gokulnath007

да... это полезно.. Но она ничего не говорит о нитях, творении и существовании...

Rajesh Anuhya

Насколько я понял ваш вопрос , Вы ищете асинхронный Tcp-сокет..??

Gokulnath007

да... но с помощью нитей. сервер должен принимать много клиентов..

Рейтинг:
0

jerrykid

Так что, пожалуйста, попробуйте:
Чат Клиент Сервер[^]


Gokulnath007

спасибо вам.. но я разрабатываю только диалог MFC на основе, а не консольное приложение..

Gokulnath007

Пожалуйста, посмотрите на мой обновленный вопрос, который содержит код, который я использую..и направьте меня.. спасибо вам....

Рейтинг:
0

Gokulnath007

Не могли бы вы прислать мне это в VC++ 2008? Visual c++ .. а не visual C#.. Спасибо Вам заранее...