c ++套接字接收需要很长时间

时间:2014-11-12 08:53:46

标签: c++ sockets

我正在编写Socket的客户端。当有东西要读时我的代码工作正常但是当没有东西要读时,recv永远不会返回。请帮助。

代码:

m_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in dest;

if ( m_socket )
{
  memset(&dest, 0, sizeof(dest));                /* zero the struct */
  dest.sin_family = AF_INET;
  dest.sin_addr.s_addr = inet_addr(address); /* set destination IP number */ 
  dest.sin_port = htons(port);

  if (connect(m_socket, (struct sockaddr *)&dest, sizeof(struct sockaddr)) == SOCKET_ERROR)
  {
    return false;
  }
  else
  {
    std::vector<char> inStartup1(2);
    int recvReturn = recv(Socket, &inStartup1.at(0), inStartup1.size(), 0);
  }

2 个答案:

答案 0 :(得分:3)

recv是一个阻止通话。这可以帮到你: -

recv()调用通常仅用于连接的套接字。它会在成功完成时返回消息的长度。如果消息太长而无法容纳在提供的缓冲区中,则可能会丢弃多余的字节。取决于接收消息的套接字类型。

如果套接字上没有消息可用,则接收调用等待消息到达,除非套接字是非阻塞的,在这种情况下返回值-1,外部变量errno设置为EAGAIN或EWOULDBLOCK。接收电话通常会返回任何可用的数据,直至请求的金额,而不是等待收到所要求的全部金额。

答案 1 :(得分:0)

更进一步,在服务器上这是你如何正确处理连接(套接字或串口无关紧要):

  1. 使套接字/端口无阻塞:这是第一个重要的步骤;这意味着recv()将读取可用的内容(如果有的话)并返回读取的字节数,如果发生错误则返回-1。
  2. 使用select(),超时,找出数据何时可用。所以现在你等待一段时间才能获得数据,而不是阅读它。
  3. 要处理的下一个问题是确保您阅读完整的消息。由于无法保证在调用recv()时整个消息可用,您需要保存可用的内容并返回select()并等待下一个数据可用。
  4. 将所有内容放入while(cond)构造中以确保您阅读所有数据。
  5. while中的条件是唯一需要解决的问题 - 您要么知道预期消息的长度,要么使用一些分隔符来标记消息的结尾。

    希望这有帮助!