我在一个周期内发送多个UDP数据报,并使用sendmmsg
和recvmmsg
系统调用接收它们。我的客户端代码是:
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
循环。如何让服务器知道消息接收已完成?
答案 0 :(得分:0)
问题是我的服务器即使在之后也没有从while循环退出 客户端完成发送所有消息。
UDP服务器没有客户端连接的任何概念,UDP服务器也不知道客户端何时已完成发送&#34;。
您的recvmmsg
电话将等到客户端向其发送数据报。如果您的客户端可以告诉服务器退出,则需要在应用程序协议级别完成。