【问题标题】:Server still running despite client stopped sending messages尽管客户端停止发送消息,服务器仍在运行
【发布时间】:2017-02-26 08:10:39
【问题描述】:

我在一个循环中发送多个 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 循环,即使在客户端发送完所有消息之后也是如此。如何让服务器知道消息接收已完成?

【问题讨论】:

  • 使用一条消息作为最终消息,如果服务器收到,它可以打破循环。

标签: c++ sockets udp


【解决方案1】:

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

UDP 服务器没有任何客户端连接的概念,UDP 服务器也不知道客户端何时“完成发送”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2017-01-12
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多