在网络通信开发中,我需要在服务器和客户端建立100个连接,请问怎样用多线程的方式来实现呢?!谢谢!!!
解决方案 »
- 请教域名转换ip问题
- installshield2010支持vc6.0吗?
- 谁有这个东西啊?
- 100分,求编程禁/启用打印机的指点
- 如何将封装在dll里的类导出到应用程序里使用.
- <<STL源码分析>>中的最后STLPort移植问题,请指点。在线
- 请问高手:有一个子窗口,这个子窗口的某个函数在其父窗口上又创建了一个子窗口,现在如何把新子窗口的消息交给原来那个子窗口处理呢?
- MFC 客户端 CSocket 里面接(RevMsg)收消息后,在里面调用函数报错
- 想做一下手持设备USB驱动的安装包,请给一些提示.
- 这段调用汇编使扬声器发音的程序为何编译通不过
- 为什莫在98下FillRgn会出错,急急急急!!!!!!!!!!!!!!
- 为什莫
2.建立socket连接,生成线程时把那个socket句柄作为参数传给线程。
3.在线程里面完成通信的逻辑。为了让线程能一直运行下去,总体上线程内部是一个循环。只有满足一定条件就退出循环从而结束一个线程。
while(1)
{
查找有无空闲的连接套接字?有:
cnSock=accept(listenSock,.....);
if(cnSock!=INVALID_SOCKET)
{
CreateThread(....recv线程......);
}
}
recv线程:负责接收数据,注意将accept返回的socket作为参数传到该线程里。
我只想开一个端口,并且每个线程做的事情是一样的,或者不一样都无所谓!!!
#define ___GATEWAY_H____#define MAX_RECV_THREAD 5 '工作线程数
#define SOCKET_PER_THREAD 30 '每个线程管理的Socket数量
#define Max_Connect MAX_RECV_THREAD * SOCKET_PER_THREAD '可接受的连接数class CGateWay
{
public:
CGateWay();
virtual ~CGateWay(); struct CP
{
int socket;
int issender;
int id;
}; CP m_gateWays[Max_Connect]; int Add(int sk,int id,int issender=true);
int Remove(int index);
int Close(int sk);
int GetSocket(int id,int& index);
int PutSocket(int sk,int id);
int Sockets(int index);
int PutID(int sk,int id,int issender);
};
#endif
m_sk是上面的类的一个实例int CServerSocket::DoRecv()
{
int base=0;
m_MutexBase.Lock();
base=SOCKET_PER_THREAD*m_base++;
m_MutexBase.Unlock();
TRACE("begin thread Base:%d\n",base);
int i,ret =0,status;
MSG_HEAD msg_head;
while(IsListening())
{
Sleep(20);
fd_set rdset,errset;
FD_ZERO(&rdset);
FD_ZERO(&errset);
for(i=base;i<base+SOCKET_PER_THREAD;i++)
{
int sk=m_sk.Sockets(i);
if(sk!=INVALID_SOCKET)
{
FD_SET(sk,&rdset);
FD_SET(sk,&errset);
}
}
if(rdset.fd_count==0)continue;//È«²¿ÉÐδÁ¬½Ó
TRACE("Base:%d,·¢ÏÖÒѾ­Á¬½ÓµÄSocket %d ¸ö\n",base,rdset.fd_count);
struct timeval tval;
tval.tv_sec =10;
tval.tv_usec =0;
status =::select(-1, &rdset, NULL, &errset, &tval);
if(status==0)continue;//È«²¿Ã»ÓÐ
TRACE("Base:%d,·¢ÏÖÓÐÊý¾ÝµÄSocket %d ¸ö\n",base,rdset.fd_count);
for(i=base;i<base+SOCKET_PER_THREAD;i++)
{
int sk=m_sk.Sockets(i);
if(sk==INVALID_SOCKET)continue;
if(FD_ISSET(sk,&errset))//ÊÇ·ñ·¢Éú´íÎó
{
m_sk.Remove(i);
m_tcp->close(sk);
}else if(FD_ISSET(sk,&rdset))//ÓÐÊý¾Ý¿É¶Á
{
if(ReciveHead(msg_head,sk))
{
if(RecvMsg(msg_head,sk)==-1)
{
m_sk.Remove(i);
m_tcp->close(sk);
}
}
}
}
}
return 0;
}
while (IsListening ())
{
bool bRightSock = (lsock == m_socket);
if (!bRightSock) return 2;
csock =m_tcp->accept(lsock,5);
if (csock == INVALID_SOCKET)
{ continue;
}
m_MutexBase.Lock();
m_sk.Add(csock,0,1);
m_MutexBase.Unlock();
}