Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2023442
  • 博文数量: 960
  • 博客积分: 52560
  • 博客等级: 大将
  • 技术积分: 13131
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-31 14:15
文章分类

全部博文(960)

文章存档

2011年(1)

2008年(959)

我的朋友

分类: C/C++

2008-08-01 16:55:08

下载本文示例代码
下载源代码


摘要:

本文通过例子,介绍了如何在局域网中进行聊天、互发文件以及抓取对方屏幕保存为文件。程序还包括了取得本机和对方的IP、计算机名称。滚动ListBox控件等功能本人初次发表文章只是想起抛砖引玉之功效,其中错误在所难免,请各位看客别拿瓜皮丢我,谢谢。

运行界面如下:



一、 启动终止监听线程(只介绍TCP)

由于此程序可以即时切换状态,因此需要结束仍处于接受状态的线程。
//TCP监听线程

UINT _ListenTcpThread(LPVOID lparam)

{

	CMyQQDlg *pDlg=(CMyQQDlg *)lparam;

	CSocket sockSrvr;

	pDlg->m_Potr=PORT pDlg->m_server;//保存当前使用端口,用于关闭

	int createSucceed=sockSrvr.Create(pDlg->m_Potr);

	int listenSucceed=sockSrvr.Listen();	//开始监听

	CSocket recSo;

	SOCKADDR_IN client;

	int iAddrSize=sizeof(client);

	int acceptSucceed=sockSrvr.Accept(recSo,(SOCKADDR *)&client,&iAddrSize);	//接受连接并取得对方IP

	sockSrvr.Close();

	char flag[FLAG]={0};		//接受标示,用于判断接受到的是信息,文件等

	if(recSo.Receive(flag,FLAG)!=2) 

	{

		return -1;	

	}

	pDlg->m_type=flag[0];

	if(pDlg->m_type==''D'') return 0;//终止此线程

	pThreadLisen=::AfxBeginThread(_ListenTcpThread,pDlg);

	pDlg->ReceiveFileMsg(recSo,client);

	return 0;

}
关闭

if(m_nSockType==SOCK_TCP)

{

	DWORD   dwStatus;

	if (pThreadLisen != NULL)

	{

		if(::GetExitCodeThread(pThreadLisen->m_hThread, &dwStatus)==0)

		{

			int errror=GetLastError();

			return;

		}

		if (dwStatus == STILL_ACTIVE)

		{

			CSocket sockClient;

			sockClient.Create();

			CString ip,strError;

			ip="127.0.0.1";

			int conn=sockClient.Connect(ip, m_Potr);

			if(conn==0)	

			{

				AfxMessageBox("关闭错误!" GetError(GetLastError()));

				sockClient.ShutDown(2);

				sockClient.Close();

				return;

			}

			sockClient.Send("D",FLAG); //结束

		}

}

        
二.发送、接受文件。比较简单,参看源程序。 发送

for(;;)

{

	num=myFile.Read(m_buf, SIZEFILE);

	if(num==0) break;//读文件完毕

	end=sockClient.Send(m_buf, num); 

}

接受

for(;;)

{

	n=recSo.Receive(buf,SIZEFILE);	//接受

	if(n==0)	break;	//0表示结束

	f.Write(buf,n);

}

三、聊天请参看源程序

else if(m_type==''M'')	//信息

{

	char buff[100]={0};

	CString msg;

	int ret=0;

	for(;;)

	{

		ret=recSo.Receive(buff,100);

		if(ret==0)

			break;

		msg =buff;

	}

	CString strOut,strIn;

	m_You_IP.GetWindowText(strIn);

	GetNamebyAddress(strIn,strOut);

	CString youName;

	youName.Format(inet_ntoa(client.sin_addr));

	CString str=youName "<-" strOut;

	AddMsgList(str,msg);

}

四、抓屏,VC知识库上例子很多,不详细介绍了。在VC6 Win2000上测试过。

下载本文示例代码
阅读(363) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~