小弟有一程序需要连续分配大量的端口号,然后创建sokcet,绑定地址和这个端口号,端口号从1024以后的开始的,3000,5000,7000开始都尝试过,但都有绑定不成功的现象出现,但如何总有绑定失败的呢?

解决方案 »

  1.   

    绑定失败就继续绑定下一个端口,直到绑定成功或者使用setsockopt设置端口重用
      

  2.   

    #define SEND_BASE_PORT 9000 //起始分配的端口号for(int i = 0; i < m_FileInfo.iThreadCount; i++) //循环产生线程,每个线程都要socket绑定
    {
    SendInfo sendInfo;
    sendInfo.iOder = i;
    //sendInfo.strname = this->m_strFileName;
    memcpy((void *)sendInfo.strname, (void *)(LPCTSTR)m_strFileName, m_strFileName.GetLength());
    sendInfo.strname[m_strFileName.GetLength()] = '\0'; if(i == (m_FileInfo.iThreadCount - 1))
    sendInfo.lSize = m_FileInfo.lSize - m_lSize * (m_FileInfo.iThreadCount - 1);
    else
    sendInfo.lSize = m_lSize;
    sendInfo.sPort = SEND_BASE_PORT + i; //  每个线程中要绑定的端口号 Sleep(1000);
    AfxBeginThread((AFX_THREADPROC)SendFileThread, (LPVOID)&sendInfo);//产生线程
    }
    UINT SendFileThread(LPVOID pParam)
    {
    SendInfo * sendInfo = (SendInfo *)pParam; char * buffer = new char[DATA_BUF];
    if(buffer == NULL)
    return -1; SOCKET sock;
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if(sock == INVALID_SOCKET)
    return -1; SOCKADDR_IN saddr;
    memset((void *)&saddr, 0, sizeof(SOCKADDR_IN));
    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = ADDR_ANY;
    saddr.sin_port = htons(sendInfo->sPort); int iResult = bind(sock, (sockaddr *)&saddr, sizeof(sockaddr)); //绑定
    if(iResult == SOCKET_ERROR)
    {
    AfxMessageBox("bind() 失败!"); return -1;
    } iResult = listen(sock, 5);
    if(iResult == SOCKET_ERROR)
    {
    AfxMessageBox("listen() 失败!");
    //WSACleanup(); return -1;
    } SOCKET acceptSock;
    SOCKADDR_IN socaddrin;
    int nSize = sizeof(SOCKADDR_IN);
    acceptSock = accept(sock, (sockaddr *)&socaddrin, &nSize);
    if(acceptSock == INVALID_SOCKET)
    return -1; CFile file;
    if(file.Open(sendInfo->strname, CFile::modeRead | CFile::shareDenyNone))
    {
    file.SeekToBegin();
    file.Seek(CFile::begin, (sendInfo->iOder - 1)*sendInfo->lSize);
    long lsize = sendInfo->lSize;
    UINT uSize;
    UINT uFinish = 0;
    UINT uCurrent = DATA_BUF; while(uFinish <= lsize)
    {
    uSize = file.Read((void *)buffer, uCurrent);
    if(uSize <= 0)
    return -1;

    uFinish += uSize;
    if((lsize - uFinish) < DATA_BUF)
    uCurrent = lsize - uFinish;
    //lsize -= uSize; if(send(acceptSock, (char *)buffer, uSize, 0) <= 0)
    return -1;
    }
    }
    file.Close(); delete buffer;
    buffer = NULL; return 0;
    }
      

  3.   

    #define SEND_BASE_PORT 9000 //起始分配的端口号for(int i = 0; i < m_FileInfo.iThreadCount; i++) //循环产生线程,每个线程都要socket绑定
    {
    SendInfo sendInfo;
    sendInfo.iOder = i;
    //sendInfo.strname = this->m_strFileName;
    memcpy((void *)sendInfo.strname, (void *)(LPCTSTR)m_strFileName, m_strFileName.GetLength());
    sendInfo.strname[m_strFileName.GetLength()] = '\0'; if(i == (m_FileInfo.iThreadCount - 1))
    sendInfo.lSize = m_FileInfo.lSize - m_lSize * (m_FileInfo.iThreadCount - 1);
    else
    sendInfo.lSize = m_lSize;
    sendInfo.sPort = SEND_BASE_PORT + i; //  每个线程中要绑定的端口号 Sleep(1000);
    AfxBeginThread((AFX_THREADPROC)SendFileThread, (LPVOID)&sendInfo);//产生线程
    }
    UINT SendFileThread(LPVOID pParam)
    {
    SendInfo * sendInfo = (SendInfo *)pParam; char * buffer = new char[DATA_BUF];
    if(buffer == NULL)
    return -1; SOCKET sock;
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if(sock == INVALID_SOCKET)
    return -1; SOCKADDR_IN saddr;
    memset((void *)&saddr, 0, sizeof(SOCKADDR_IN));
    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = ADDR_ANY;
    saddr.sin_port = htons(sendInfo->sPort); int iResult = bind(sock, (sockaddr *)&saddr, sizeof(sockaddr)); //绑定
    if(iResult == SOCKET_ERROR)
    {
    AfxMessageBox("bind() 失败!"); return -1;
    } iResult = listen(sock, 5);
    if(iResult == SOCKET_ERROR)
    {
    AfxMessageBox("listen() 失败!");
    //WSACleanup(); return -1;
    } SOCKET acceptSock;
    SOCKADDR_IN socaddrin;
    int nSize = sizeof(SOCKADDR_IN);
    acceptSock = accept(sock, (sockaddr *)&socaddrin, &nSize);
    if(acceptSock == INVALID_SOCKET)
    return -1; CFile file;
    if(file.Open(sendInfo->strname, CFile::modeRead | CFile::shareDenyNone))
    {
    file.SeekToBegin();
    file.Seek(CFile::begin, (sendInfo->iOder - 1)*sendInfo->lSize);
    long lsize = sendInfo->lSize;
    UINT uSize;
    UINT uFinish = 0;
    UINT uCurrent = DATA_BUF; while(uFinish <= lsize)
    {
    uSize = file.Read((void *)buffer, uCurrent);
    if(uSize <= 0)
    return -1;

    uFinish += uSize;
    if((lsize - uFinish) < DATA_BUF)
    uCurrent = lsize - uFinish;
    //lsize -= uSize; if(send(acceptSock, (char *)buffer, uSize, 0) <= 0)
    return -1;
    }
    }
    file.Close(); delete buffer;
    buffer = NULL; return 0;
    }
      

  4.   

    连续的大量端口?不太好.
    嗯, 按Caps77(厉兵秣马)说的吧, 哪个能用用哪个.
      

  5.   

    绑定失败后应该调用GetLasterror来看看失败的原因呀,有可能某些端口已经被占用了
      

  6.   


    SendInfo sendInfo; for循环的一个周期后就应该失效了(进入thread之后状态不确定)
     改为 SendInfo *sendInfo=(SendInfo *)malloc(sizeof(SendInfo);
    然后在线程里使用完后后释放,free(sendInfo);
      

  7.   

    用WSAGetLastError()函数,
    int err;
    if ( bind(......) == SOCKET_ERROR )
    {
      err = WSAGetLastError();  //这里设断点,查看一下err值就知道了
      。
      。
      。