我需要启动一系列的侦听,每个侦听都需要侦听不同的端口,端口可以随机获得,只要求没有被占用即可。
我用的这种办法来获得,但是总是出现问题。unsigned long l_nPort = 9001;
for (; l_nPort<9100; l_nPort++)
{
                SOCKET l_sListen;
l_sListen = socket(PF_INET, SOCK_STREAM, 0);
if( l_sListen == -1 )
{
l_nPort --;
continue;
}
struct  sockaddr_in  SERVER;
SERVER.sin_family      = PF_INET;
SERVER.sin_addr.s_addr = INADDR_ANY;
SERVER.sin_port =htons((unsigned short)l_nPort);
if(bind(l_sListen,(struct sockaddr *) &SERVER,sizeof(SERVER)))
{
closesocket(l_sListen);
continue;
}
else
{
BOOL l_bDontLinger = FALSE; 
setsockopt(l_sListen,SOL_SOCKET,SO_DONTLINGER,(const char*)&l_bDontLinger,sizeof(BOOL));
closesocket(l_sListen);
break;
}
}
        startListen(pFTNI,pcFile, l_nPort);总是出现问题,后面bind这个端口的时候,报10048错误,我查了一下说是端口只能被使用一次。
想请教一下是什么地方出现了错误?

解决方案 »

  1.   

    BOOL l_bDontLinger = FALSE; 
    setsockopt(l_sListen,SOL_SOCKET,SO_DONTLINGER,(const char*)&l_bDontLinger,sizeof(BOOL));因该是端口还没有被完全关闭,可以把上面的代码改一改BOOL l_bLinger = TRUE; 
    setsockopt(l_sListen,SOL_SOCKET,SO_LINGER,(const char*)&l_bLinger ,sizeof(BOOL));改成这样子,端口将被强制关闭
      

  2.   

     struct  sockaddr_in  SERVER;
            SERVER.sin_family      = PF_INET;
            SERVER.sin_addr.s_addr = INADDR_ANY;
            SERVER.sin_port =0;
            if(bind(l_sListen,(struct sockaddr *) &SERVER,sizeof(SERVER)))
            {绑定 0端口就是 绑定一个未占用的端口
      

  3.   

    谢谢两位呵~
    to thirddata:
    我试试呵~
    to abomber2:
    额,这样子我可以知道我是绑定的哪个端口吗?
      

  4.   

    to thirddata:
    貌似没有用的~还是那样子。
      

  5.   

    abomber2的方法可行的,利用getsockname得到所绑定的端口
      

  6.   

    额,abomber2的办法在我的程序里也不好用,我用别的办法搞定了呵~