如果不用bind直接connect,系统分给客户端的端口是随机的,我想用固定的端口就用了下面的程序,可是只能连接几次,多了就connect不上了,得过一会才行好像,为什么呢?        
          
           int flag=0,lenn=sizeof(int); 
           client.sin_family=AF_INET;    
           client.sin_port=htons("5569");       
  client.sin_addr.S_un.S_addr=inet_addr("201.4.155.130");    //客户端ip
  
           if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&flag,lenn)<0)
                MessageBox("setsockopt error");  
  
           if(bind(sock,(struct sockaddr *)&client,sizeof(client))<0)  
       MessageBox("bind client error");                  
  
           if(connect(sock,(const sockaddr*)&server,sizeof(server)))       
                MessageBox("not connect ");

解决方案 »

  1.   

    端口并未及时关闭,是否调用closesocket了?
      

  2.   

    当你的客户端调用closesocket()的时候,服务器会收到通知,
    它们之间会通过三次协商最后相互关闭;它们都会经历一个过程
    由:TIME_WAIT-->closesocket();这个过程一般要经历4分钟(240s)
    所以当你的客户bind()一个固定端口后,在断开到重新连接的过程
    至少是240s
      

  3.   

    可是这样的话应该只能连接第一次,第二次就一定不成功了(两次时间间隔为2秒),为什么有的机器可以连续连接多次然后才不能连接呢?
    而且如果是TIME_WAIT,是不是bind应该提示出错呢?为什么没有这样的提示那?
      

  4.   

    setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&flag,lenn)<0)
    flag=1或0都没有用,有什么区别吗?winsock里面是不是没有SO_REUSEPORT ?
      

  5.   

    setsockopt()可以控制缓冲区大小,以及程序需要还
    是不需要Socket缓冲;
      

  6.   

    我得程序如下(一个字都不少了),只能连接两次!!去掉bind一句就可以长时间连接,受不了了:
    int main()
    {
       WSADATA wsaData;
       WORD version=MAKEWORD(2,0);
       int ret=WSAStartup(version,&wsaData);
             
       if(ret!=0)
          perror("Initilize Error!\n");      //初始化socket失败
       struct sockaddr_in server_addr,client_addr; 
       int serSocket,flag,count;
       count=0;
       server_addr.sin_family = AF_INET; 
       server_addr.sin_port = htons(7777); 
       server_addr.sin_addr.S_un.S_addr=inet_addr("213.14.10.120");  //服务器ip地址
      
        while(count<30)
    {
           count++;
           if((serSocket=socket(AF_INET,SOCK_STREAM,0)) == -1) 
       { 
              printf("创建Socket发生错误!"); 
             closesocket(serSocket);
              return -1; 
       } 
       
           flag=1; 
           setsockopt(serSocket,SOL_SOCKET,SO_REUSEADDR,(char *)&flag,sizeof(int));        client_addr.sin_family = AF_INET; 
           client_addr.sin_port = htons(6696); 
           client_addr.sin_addr.s_addr = INADDR_ANY; 
           if(bind(serSocket,(struct sockaddr *)&client_addr,sizeof(client_addr)) == -1) 
       {  
             printf("绑定错误"); 
     closesocket(serSocket);
             return -1; 
       }        if(connect(serSocket,(struct sockaddr *)&server_addr,sizeof(server_addr))==-1) 
       { 
              printf("连接服务器发生错误,地址:");
      closesocket(serSocket);
              return -1; 
       }
       else 
      printf("连接成功%d\n",count);
       closesocket(serSocket);
    }
       }
      

  7.   

    Try Use this : WSADATACleanUp ();