【发布时间】:2017-02-26 08:10:39
【问题描述】:
我在一个循环中发送多个 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 循环,即使在客户端发送完所有消息之后也是如此。如何让服务器知道消息接收已完成?
【问题讨论】:
-
使用一条消息作为最终消息,如果服务器收到,它可以打破循环。