📄 netmulthread.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 + -