linux非阻塞套接字,发送前或发送后我做选择吗?

时间:2013-12-06 15:54:29

标签: linux sockets select send

我在Linux上有一个非阻塞的连接套接字,在我的第一个send()之前,我选择查看套接字是否已准备好写入,但是选择超时。

如果我不做选择,发送工作正常。

如果我先选择,我永远不会发送任何东西。

当套接字明显可写时,为什么在发送之前选择超时?

这是我正在使用的一些代码:

  fd_set writefds;
  struct timeval timeout;//
  FD_ZERO(&writefds);
  FD_SET(s, &writefds);//s is my connected socket
  timeout.tv_sec = 10;
  timeout.tv_usec = 0;

  ret = select(1, 0, &writefds, 0, &timeout);
  switch(ret)
  {
  case 1://socket is ready for writing
     bytesSent = send(s, (const char*)(buf+bytesSent), len-bytesSent, 0);
     if(SOCKET_ERROR == bytesSent)
     {
        *error = errno;
        if(EWOULDBLOCK == *error)
        {
           goto Exit;
        }
        sprintf(errmsg, ("send() failed %i\n"), *error);
     }
     else if(bytesSent < len)
     {
        sprintf(errmsg, ("send() incomplete\n"));
     }
     else
     {
        //sprintf(errmsg, ("sent %i bytes\n"), bytesSent);
     }
     break;
  case 0://timeout --!!!! always comes here
     bytesSent = -1;//treat as error
     break;
  default:
     bytesSent = -1;
  }

}

  

块引用

1 个答案:

答案 0 :(得分:0)

在从Windows select()UNIX/Berkeley-derived select()的端口中,您将您提供的虚拟值保留为select()的第一个参数。

在UNIX上,当然,此参数( nfds )是有意义的,必须大于集合中的最高fd。因此,对你来说它应该是s + 1