我正在使用UDP编写一个简单的Web服务器和客户端到目前为止:
我的问题是我的客户端代码在rcvfrom
函数中等待,即使在服务器发送了响应后也是如此。
这是应该获取服务器消息并返回套接字读取的字节数的函数:
ssize_t receive_from_server(rdp_socket *rsocket, char *buffer, size_t buf_len){
socklen_t sendsize = sizeof(rsocket->server_addr);
bzero(&(rsocket->server_addr), sendsize);
//STUCK HERE:
return recvfrom(rsocket->sockfd, buffer, buf_len, 0,
(struct sockaddr*)&(rsocket->server_addr), &sendsize);
}
我将SO_SNDTIMEO
和SO_RCVTIMEO
的sockopts设置为几秒后超时。
在短期内,我将添加确认(ACK)以进行可靠的数据传输。我想失去的确认可能是问题,但我只是想知道,对于受过训练的人来说,它看起来是不同的问题。
超时工作需要ACK吗?
如何同步我的客户端和服务器,以便他们可以实际相互通信?
答案 0 :(得分:2)
由于UDP不提供可靠性,因此您需要实现丢失数据的重传。由于它看起来像是客户端请求服务器响应模型,因此最简单的重新传输实现可能是在您等待响应超时时重新发送请求,并再次等待响应。您可能希望实现重试计数器并在重试一定次数后放弃。
如果SO_RCVTIMEO
和SO_SNDTIMEO
套接字选项似乎没有生效,则可能是那些类型的套接字没有实现这些选项。检查setsockopt()
调用的返回值以确保它们成功。
作为一种变通方法,您可以将receive_from_server()
函数更改为使用poll()
或select()
等待可读事件一段时间,而不是在{{1}中阻止}。
recvfrom()