本帖最后由 VisualEleven 于 2011-01-25 17:09:25 编辑

解决方案 »

  1.   

    2,假如现在有端口2000,客户端A和端口2000建立socket=21000,之后客户端B又和端口建立socket=22000;如果这时通过socket=21000发送数据还可以吗?
      

  2.   

    服务器端维护客户端的socket链表,转发给与其相连的客户端
      

  3.   


    1、一般来说,一个端口就代表一种服务,不同的服务应该在不同的线程处理。所以没监听一个端口,需要创建一个单独的线程处理数据的收发。
    2、有客户端连接时,保存客户端的socket,检测各个socket,有数据来接收or直接用socket发送数据。根据lz的描述,一个端口完全满足你的要求啦。
      

  4.   

    试了用同一ip同一port做服务器,N个客户端来连得情况,确实建立的socket可以独立通讯,可是不明白为什么?
    我一直以为是,客户端A和端口2000建立socket=21,之后客户端B又和端口2000建立socket=22,那么此时A与服务器建立的链接就被B与服务器建的链接挤掉,只有socket=22有效
      

  5.   

    你可以开一个端口,建一个SOCKET,用来侦听所有客户端,侦听到后每个客户端建立一个通讯SOCKET形成列表。和客户端通讯的端口可以由服务器自由分配(那个空闲用哪个)。所以说,需制定一个端口并告诉客户端,客户端用来连接(IP+端口)
      

  6.   

    我想您用的协议应该是tcp吧,您只要开一个端口监听就可以了
    int l()
    {
         int fromlen=sizeof(np.fromaddr);
    int errcode;
    SOCKET m_hSocket,temps;
    struct sockaddr_in fromaddr;
    HANDLE hReadHandle;
    DWORD dThreadId;
    if(::listen(m_hSocket,5)==SOCKET_ERROR)
    {
    ::MessageBox(NULL,"监听出错","监听出错",MB_OK);
    return 0;
    }
    while(1)
    {
    temps=accept(pgprs->m_hSocket,(struct sockaddr *)&(fromaddr),&fromlen);
    if(temps!=INVALID_SOCKET)
    {
     hReadHandle=(HANDLE)_beginthreadex(NULL,0,rt,(LPVOID)&np,0,(unsigned int *)&dThreadId);
    SetThreadPriority(hReadHandle,THREAD_PRIORITY_TIME_CRITICAL);
    CloseHandle(hReadHandle);
    }
    else
    {
    errcode=WSAGetLastError();
    if(errcode=10004)break;
    }
    }
    return 0;
    }
    unsigned int __stdcall rt(LPVOID lpParameter)
    {
            SOCKET rs=(PNetPrama)lpParameter;
    //CRequestSocket *psockobject;
    UINT lparam=0;
    volatile int sendresult,length,i,i1,i2;
    unsigned char buf1[1024],
    length=::recv(rs,(char *)buf1,1024,0);//MSG_PEEK
    if(length==SOCKET_ERROR||length==0)
    {
    ::closesocket(rs);
    return 0;
    }
            send(rs,...);
            ::closesocket(rs);
    }
      

  7.   

    对不起,创建线程的代码应该是:
    hReadHandle=(HANDLE)_beginthreadex(NULL,0,rt,(LPVOID)temps,0,(unsigned int *)&dThreadId);