你的意思是指这些连接都用同一个端口,但是由cpu轮流分配与这些客户端传输数据的时间,是吗?我看到一个例程,它指定了侦听端口,但是对于与客户机相连的socket,未做任何指定,请问,这些socket,及它们的端口,是自动分配的,不会冲突,还是,它们是共用
一个socket,由cpu轮流分配时间,又,若不指定,自动分配的socket会和侦听socket重复,引起冲突吗?

解决方案 »

  1.   

    在一台机器上,一个端口只能被一个socket占用。
    常规用法:用一个socket进行侦听,实际服务由另一socket完成。
    只有侦听socket要指定端口,实际服务socket可由系统自动分配(不会与已有的端口重复)。
    CSocket有自己的消息循环,用于监视端口!
      

  2.   

    端口应该没有被重新分配,可以通过netstat -an查看一下连接的情况。它是在Socket内部做了类似协议栈。
      

  3.   

    若如zhq2000(俗子)所说:实际服务socket可由系统自动分配(不会与已有的端口重复)。但为什么我用netstat查看,发现和客户机相连的本地端口依然是指定的侦听端口。
    eggplant(拉拉) 所说:端口应该没有被重新分配。是否就是指所有与客户机的连接都用
    同一端口?
      

  4.   

    void CListenSocket::OnAccept(int nErrorCode) 
    {
    CCoderDlg* dlg=(CCoderDlg*)::AfxGetMainWnd();
    CString strMeg;
    // TODO: Add your specialized code here and/or call the base class
    CClientSocket* pClientSocket=new CClientSocket();
    SOCKADDR SockAddr;
    int nAddrLen=sizeof(SOCKADDR);
        if(this->Accept(*pClientSocket,&SockAddr,&nAddrLen))
    {
            //check ip here
    SOCKADDR_IN *pAddIn=(SOCKADDR_IN*)&SockAddr;
    CString strIP;
    strIP.Format("%d.%d.%d.%d",pAddIn->sin_addr.S_un.S_un_b.s_b1,pAddIn->sin_addr.S_un.S_un_b.s_b2,
    pAddIn->sin_addr.S_un.S_un_b.s_b3,pAddIn->sin_addr.S_un.S_un_b.s_b4);

    //mytest
    //CString strPort;
    //strPort.Format("port:%d",pAddIn->sin_port); if(this->IsValidataIP(strIP))
    {
    strMeg="有效的IP地址:"+strIP+"连接上来了";
    dlg->AddMessage(strMeg);
    ::AfxBeginThread(ConnectProc,(LPVOID)pClientSocket); }
    else
    {
    delete pClientSocket;
    strMeg="一个非法的IP地址:"+strIP+"企图连接";
    dlg->AddMessage(strMeg);
    } }
    else
    delete pClientSocket;

    CSocket::OnAccept(nErrorCode);
    }
      

  5.   

    我想是这样的,侦听的socket要指定端口以避免重复,实际连接的socket也可以指定,如果不指定,系统将采用默认端口,比如常用的80端口等……
      

  6.   

    我想你首先要搞清Socket的概念,一个Socket是一对IP地址和端口,侦听时若有新客户连接上来它生成的是一个新的Socket,在服务器端使用的端口号仍然是原有的那一个,但客户端已经变了所以引起了Socket的变更。如果你看过WinSock函数,就会看到Accept函数的返回值是一个Socket。
      

  7.   

    按roland_c(凤凰) 的意思,一个Socket是包含了两个IP地址和两个端口(分别是相互通信的两台主机的)?但是书上说:一个套接字就是通信的一端。
    不是两端啊?望赐教!!!
      

  8.   

    你在什么书上看到的?我不能理解。服务器同时可以连接多个客户端的,这个时候它并不只使用一个Socket,从API函数accept的返回值就可以看到这一点的。