程序第一次运行能正常连接到服务器. 并能进行数据传输 . 发命令到服务器请求断开连接 .并关闭socket 后 . 重新连接服务器 . 运行到这段代码 result  =  select(sk.socket+1,NULL,&writefds,NULL,&tv); 这段代码. 返回0  . 重启模似器后. 第一次能正常运行 . 请大家指点.   sk.socket = socket(AF_INET,SOCK_STREAM,0);
if(sk.socket == SOCKET_ERROR)
{
return 0;
}
unsigned long ul = 1;
result  = ioctl(sk.socket, FIONBIO, &ul); //设置为非阻塞模式
if(result==-1)
{
__android_log_print(ANDROID_LOG_ERROR,"Tag", "  ioctl  FIONBIO  error    :%d \n", result );
return  0;
}
int error;
result =  connect(sk.socket,(struct sockaddr*)&m_DeviceAddr,sizeof(struct sockaddr));
if( result == -1 )
{
 if (errno == EINPROGRESS)
 {// it is in the connect process
     struct timeval tv;
     fd_set writefds;
     tv.tv_sec = 30;
     tv.tv_usec = 0;
     FD_ZERO(&writefds);
     FD_SET(sk.socket, &writefds);
   result  =  select(sk.socket+1,NULL,&writefds,NULL,&tv);
   __android_log_print(ANDROID_LOG_ERROR,"Tag", "  select    error  :%d \n", result );
     if(result>0)
     {
     int len = sizeof(int);
     getsockopt(sk.socket, SOL_SOCKET, SO_ERROR, &error, &len);
     if(error==0)
     {
    unsigned long ul = 0;
    result  = ioctl(sk.socket, FIONBIO, &ul);
    if(result==-1)
    {
  return  0;
    }
  struct timeval timeout={3,0};//3s   result = setsockopt(sk.socket,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));
  if(result>0||result<0)
  {
  return 0;
  }   result = setsockopt(sk.socket,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
  if(result>0||result<0)
  {
    return 0;
  }
    memset(buf,0,200);
      result = ReceiveData(sk.socket,m_DeviceTypeInfo,64,20);
    if( result == SOCKET_ERROR)
    {
    sk.socket = NULL;
    return 0;
    }
    netprotrocolver = *((unsigned long*)m_DeviceTypeInfo+3);
    return 1;
     }
       }
     else
     {
      __android_log_print(ANDROID_LOG_ERROR,"Tag", "  error   :%d \n", errno );
     }
 }
 else
 {
     return 0;
 }
sk.socket = NULL;
}
return 0;
}

解决方案 »

  1.   

       //
    bool REUSEADDR = true;
    setsockopt(msg_videosocket.cmdsk,SOL_SOCKET,SO_REUSEADDR,&REUSEADDR,sizeof(bool)); //
    struct linger linger;
    linger.l_onoff = 1;
    linger.l_linger = 0;
    setsockopt(msg_videosocket.cmdsk,SOL_SOCKET, SO_LINGER,  (const char *) &linger, sizeof(linger));
      

  2.   

    result = select(sk.socket+1,NULL,&writefds,NULL,&tv);
    select调用后writefds的内容会被改变,所以只能够连接成功一次,在建一个fd_set变量fds,
    fds = writefds,然后result = select(sk.socket+1,NULL,&fds,NULL,&tv);
      

  3.   

    为什么我的socket创建都失败了呢,参数和你的是一样的