一个TCP和UPD聊天、传收文件程序

本文介绍了一个基于TCP协议的局域网聊天程序,包括聊天、文件传输和屏幕抓取功能。程序还提供了获取本机及对方IP地址、计算机名称等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一个TCP和UPD聊天、传收文件程序


作者:
河北 CA王雪松

下载源代码


 摘要:

    本文通过例子,介绍了如何在局域网中进行聊天、互发文件以及抓取对方屏幕保存为文件。程序还包括了取得本机和对方的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上测试过。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值