在网络通信开发中,我需要在服务器和客户端建立100个连接,请问怎样用多线程的方式来实现呢?!谢谢!!!

解决方案 »

  1.   

    先处理一个clientsocket的多线程
      

  2.   

    1.你要会生成线程,杀死线程,最好还会线程间通信。这部分内容和socket没关系可以找本书看看。
    2.建立socket连接,生成线程时把那个socket句柄作为参数传给线程。
    3.在线程里面完成通信的逻辑。为了让线程能一直运行下去,总体上线程内部是一个循环。只有满足一定条件就退出循环从而结束一个线程。
      

  3.   

    accept线程:
    while(1)
    {
        查找有无空闲的连接套接字?有:
        cnSock=accept(listenSock,.....);
        if(cnSock!=INVALID_SOCKET)
        {
            CreateThread(....recv线程......);
         }
    }
    recv线程:负责接收数据,注意将accept返回的socket作为参数传到该线程里。
      

  4.   

    开100个线程,在里面分别作各自的事就可以了,但是每个线程的端口要不同,并且如果使用同个socket的话,要用setsockopt(....SO_REUSESOCK....)这个标志。
      

  5.   

    jzyhummel(篱影) :
    我只想开一个端口,并且每个线程做的事情是一样的,或者不一样都无所谓!!!
      

  6.   

    我采用的方案:#ifndef ___GATEWAY_H____
    #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
      

  7.   

    (续)工作线程
    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;//&Egrave;&laquo;&sup2;&iquest;&Eacute;&ETH;&Icirc;&acute;&Aacute;&not;&frac12;&Oacute;

    TRACE("Base:%d,·&cent;&Iuml;&Ouml;&Ograve;&Ntilde;&frac34;&shy;&Aacute;&not;&frac12;&Oacute;&micro;&Auml;Socket %d &cedil;&ouml;\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;//&Egrave;&laquo;&sup2;&iquest;&Atilde;&raquo;&Oacute;&ETH;
    TRACE("Base:%d,·&cent;&Iuml;&Ouml;&Oacute;&ETH;&Ecirc;&yacute;&frac34;&Yacute;&micro;&Auml;Socket %d &cedil;&ouml;\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))//&Ecirc;&Ccedil;·&ntilde;·&cent;&Eacute;ú&acute;í&Icirc;ó
    {
    m_sk.Remove(i);
    m_tcp->close(sk);

    }else if(FD_ISSET(sk,&rdset))//&Oacute;&ETH;&Ecirc;&yacute;&frac34;&Yacute;&iquest;&Eacute;&para;&Aacute;
    {
    if(ReciveHead(msg_head,sk))
    {
    if(RecvMsg(msg_head,sk)==-1)
    {
    m_sk.Remove(i);
    m_tcp->close(sk);
    }

    }

    }
    }
    }
    return 0;
    }
      

  8.   

    (续)Accept线程:lsock = m_socket;
    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();
    }