⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netmulthread.cpp

📁 类似QQ,MSN表情的richedit,用来测试表情控件的
💻 CPP
字号:
#include "stdafx.h"
#include <winsock.h>
#include "netmulthread.h"


netmulthread::netmulthread()
{
	for(int i=0; i<sourpportmaxrecvsocket; i++)
	{
		socketinfo[i].sockethandle = -1;
		socketinfo[i].btcppro = false;
	}
}

netmulthread::~netmulthread()
{
	

}

int netmulthread::findsocket(int  socket)
{
	for(int i=0; i<sourpportmaxrecvsocket; i++)
	{
		if(socketinfo[i].sockethandle == socket)
			return i;
	}

	return -1;
}


//保存socket信息用来进行数据接收
//添加socket 用socketinfo[]记录添加的socket的信息(句柄和协议类型)
bool netmulthread::addsocket(SOCKET socket, bool mbool)
{
	int index = findsocket(socket);
	if(index != -1)
		return false;

	index = findsocket(-1);
	if(index == -1)
		return false;

	socketinfo[index].sockethandle = socket;
	socketinfo[index].btcppro = mbool;

	return true;
}

bool netmulthread::deletesocket(SOCKET socket)
{
	int index = findsocket(socket);
	if(index == -1)
		return false;

	socketinfo[index].sockethandle = -1;
	socketinfo[index].btcppro = false;

	return true;
}

//接收数据
void netmulthread::recvnetdata()
{
	int result=0;
	ULONG recvip;
	USHORT recvport;

	socketinformation *pinfo;

	SOCKADDR_IN m_clinetaddr;
	int addrlen = sizeof(m_clinetaddr);

	for(int i=0; i<sourpportmaxrecvsocket; i++)
	{
		pinfo = &socketinfo[i];
		if(pinfo->sockethandle == -1)
			continue;


		/*The Windows Sockets getpeername function retrieves the name of the peer to which a socket is connected
		  int getpeername (
          SOCKET s,                    
          struct sockaddr FAR*  name,  
          int FAR*  namelen            
          );
        */
		//用m_clinetaddr保存源端的socket地址
		if(pinfo->btcppro)
		{
			result = recv(pinfo->sockethandle, get_data_buf, RECVDATABUFLEN, 0);
			getpeername(pinfo->sockethandle, (struct sockaddr FAR *)&m_clinetaddr, (int FAR *)&addrlen);
		}
		else
			result = recvfrom(pinfo->sockethandle, get_data_buf, RECVDATABUFLEN, 0, (struct sockaddr FAR *)&m_clinetaddr, (int FAR *)&addrlen);
		recvip = m_clinetaddr.sin_addr.s_addr;   
		recvport = htons(m_clinetaddr.sin_port);		

		if(result>0)
			dealrecvdata(pinfo->sockethandle, get_data_buf, result, recvip, recvport);
	}
}

//如果socket有数据接收,用线程接收数据
void netmulthread::entry()
{
	int result;
	FD_SET InternalReadfds;
	timeval tv = {0, 200000};
	bool emptysocket = true;
	while(1)
	{
		if(threadcheck())
			break;			
		emptysocket = true;
		FD_ZERO(&InternalReadfds);

		for(int i=0; i<sourpportmaxrecvsocket; i++)
		{
			if( socketinfo[i].sockethandle != -1)
			{
				emptysocket = false;
				FD_SET(socketinfo[i].sockethandle, &InternalReadfds);//设置InternalReadfds的第socketinfo[i].sockethandle位为1
			}
		}
		if(emptysocket)
		{
			Sleep(200);
			continue;
		}
        //result>0时说明有数据可接收 
		result = select(0, &InternalReadfds, NULL, NULL, &tv);//对文件描述符InternalReadfds进行检察
		if(result>0 )
			recvnetdata();
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -