尽管客户端停止发送消息,服

时间:2017-02-26 08:10:39

标签: c++ sockets udp

我在一个周期内发送多个UDP数据报,并使用sendmmsgrecvmmsg系统调用接收它们。我的客户端代码是:

struct mmsghdr *msgs;
struct iovec *iovecs;
while(interval){
  msgs = new struct mmsghdr[no_of_packets];
  iovecs = new struct iovec[no_of_packets];
  for(int i = 0;i < no_of_packets;i++){
    memset(&iovecs[i], 0, sizeof(iovecs[i]));
    iovecs[i].iov_base = (void *) to_string(i + 1).c_str();
    iovecs[i].iov_len = 1;
  }
  memset(msgs, 0, sizeof(msgs));
  for(int i = 0;i < no_of_packets;i++){
    msgs[i].msg_hdr.msg_iov = &iovecs[i];
    msgs[i].msg_hdr.msg_iovlen = 1;
  }
  ret_val = sendmmsg(socket_id, msgs, no_of_packets, 0);
  no_of_packets++;
  if(ret_val == -1)
    std::cerr << "Message sending failed.\n";
  else
    cout << ret_val << " messages sent\n";
  sleep(interval--);
}

客户端不断发送消息,直到间隔为正。我的服务器端代码不断收到这些消息:

while(true){
  msgs = new struct mmsghdr[no_of_packets];
  iovecs = new struct iovec[no_of_packets];
  char buffers[no_of_packets][packet_size + 1];
  memset(msgs, 0, sizeof(msgs));
  for(int i = 0;i < no_of_packets;i++){
    iovecs[i].iov_base = buffers[i];
    iovecs[i].iov_len = packet_size;
    msgs[i].msg_hdr.msg_iov = &iovecs[i];
    msgs[i].msg_hdr.msg_iovlen = 1;
  }
  ret_val = recvmmsg(socket_id, msgs, no_of_packets, 0, NULL);
  no_of_packets++;
  if(ret_val < 0){
    break;
  }
  else{
    cout << ret_val << " messages received\n";
    for(int i = 0;i < ret_val;i++) {
      buffers[i][msgs[i].msg_len] = 0;
      printf("Trip %d : %s\n", i + 1, buffers[i]);
    }
  }
}

问题是即使客户端完成发送所有消息,我的服务器也不会退出while循环。如何让服务器知道消息接收已完成?

1 个答案:

答案 0 :(得分:0)

  

问题是我的服务器即使在之后也没有从while循环退出   客户端完成发送所有消息。

UDP服务器没有客户端连接的任何概念,UDP服务器也不知道客户端何时已完成发送&#34;。

您的recvmmsg电话将等到客户端向其发送数据报。如果您的客户端可以告诉服务器退出,则需要在应用程序协议级别完成。