SOCKET sEcho = (SOCKET) -1;

INT32 nOne = 1;
    
INT32 nAddrLen = sizeof(struct sockaddr_in);
UINT16 uslocalPort = 0;
char chBuf[256];
        char *buf=new char[256];
INT32 nStart = GetTickCount(); // SOCKET sock_logr = sServerLog;
///////////////////////////////////////////////////////////// pAddrLocal->sin_family = AF_INET;
pAddrLocal->sin_addr.s_addr = INADDR_ANY;
pAddrLocal->sin_port = 0;        ////////////////////////////////////////////////////////////////////////////////////////////////
        sEcho = socket(PF_INET, SOCK_STREAM, 0);
        if(setsockopt(sEcho,SOL_SOCKET,SO_REUSEADDR,(char *)&nOne,sizeof(nOne))==-1)
{
DWORD error_result=GetLastError(); int aa=-1;
}

if(bind(sEcho,(struct sockaddr *)pAddrLocal, sizeof(struct sockaddr_in))==-1)
{
    DWORD error_result=GetLastError(); int aa=-1;
}
if(getsockname(sEcho,(struct sockaddr *)pAddrLocal, &nAddrLen)==-1)
{

DWORD error_result=GetLastError(); int aa=-1;
 
}        
        ////////////////////////////////////////////////////////连接服务器并接收到IP和端口函数
 

//////////////////////////////////////////////////////////
      
        close(sEcho);        sEcho = socket(PF_INET, SOCK_STREAM, 0);
        if(setsockopt(sEcho,SOL_SOCKET,SO_REUSEADDR,(char *)&nOne,sizeof(nOne))==-1)
{

DWORD error_result=GetLastError();
int aa=-1; }
        
///////////////////////////////////我这个BIND 为什么会失败的
if(bind(sEcho,(struct sockaddr *)pAddrLocal, sizeof(struct sockaddr_in))==-1);
{
 DWORD error_result=WSAGetLastError();
int aa=-1;
}      
        

解决方案 »

  1.   

    把下面的端口改成其他的!
    pAddrLocal->sin_port = 0; 
      

  2.   

    而且下边的pAddrLocal 我即使创建个新的 依然无法绑定
      

  3.   

    socket关闭后,端口不能立即再次绑定。我不知道有没有方法可以解决这个问题。
      

  4.   

    #define close(s)               closesocket((s)); (s) = (SOCKET) -1; do { } while(0)
    CLOSE我用的宏
      

  5.   

    首先你这样初始化地址结构
    pAddrLocal->sin_family = AF_INET; 
    pAddrLocal->sin_addr.s_addr = INADDR_ANY; 
    pAddrLocal->sin_port = 0; 后来你都是用这个结构来绑定
    所以你两次绑定都是绑定0端口,那是"非法"的
    改成4000,5000,8080都可以,最好大于1024
    不要去占用预留给系统的或者"非法"的端口
      

  6.   

    其实         ////////////////////////////////////////////////////////连接服务器并接收到IP和端口函数 无 
    ////////////////////////////////////////////////////////// 这部分我是连接服务器 获得自身外部IPpAddrLocal 其实第一个套接字创建只有 已经有值存在里边了。 。 
    然后第一个我套接字用完会关闭掉 我第二个套接字会用pAddrLocal 
    这个和用0应该没有关系的
      

  7.   

    pAddrLocal->sin_port = 0; //你看到这句了没有?pAddrLocal指向的内存块和你关闭套接字与否没关系,它只是一个结构,难道关闭一个套接字会删掉这样一个结构?
    就说你不要绑定0端口,4000,5000都可以,为什么不试一下
      

  8.   

    lz你是地址服用,要用端口复用!SO_REUSEPORT
      

  9.   

    tcp为了避免一些及其罕见的边界情况,一个端口使用完关闭后的一段时间是不能再绑定的,这段时间叫“平静时间”,好像是MSL秒。
      

  10.   

    if(bind(sEcho,(struct sockaddr *)pAddrLocal, sizeof(struct sockaddr_in))==-1); 
    多了个;号崩溃中
      

  11.   

    我用如下代码测试都成功
    bool bOptVal = true;
    int bOptLen = sizeof(bool); WSAData wsad;
    WSAStartup(MAKEWORD(2,2),&wsad);
    SOCKET cli = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN cli_addr;
    cli_addr.sin_family = AF_INET;
    cli_addr.sin_addr.s_addr = INADDR_ANY;
    cli_addr.sin_port = 0;
    setsockopt(cli,SOL_SOCKET,SO_REUSEADDR,(char *)&iOptVal,iOptLen);
    if(bind(cli,(sockaddr *)&cli_addr,sizeof(cli_addr)))
    {
    cout<<"bind error!   0"<<endl;
    return;
    }
    closesocket(cli);
    cli = socket(AF_INET,SOCK_STREAM,0);
    setsockopt(cli,SOL_SOCKET,SO_REUSEADDR,(char *)&bOptVal,bOptLen);
    if(bind(cli,(sockaddr *)&cli_addr,sizeof(cli_addr)))
    {
    cout<<"bind error!   1"<<endl;
    return;
    }
    closesocket(cli);
    WSACleanup();
    LZ仔细对比一下,找出问题所在