客户端/服务器:如何在C中同步UDP发送和接收?

时间:2013-07-31 18:11:07

标签: c udp client

我正在使用UDP编写一个简单的Web服务器和客户端到目前为止:

  • 程序可以相互连接,
  • 客户端可以发送请求,
  • 服务器可以读取请求,
  • 服务器可以识别客户端的IP地址和客户端的端口,
  • 服务器可以将消息发送回客户

我的问题是我的客户端代码在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_SNDTIMEOSO_RCVTIMEO的sockopts设置为几秒后超时。

问题:

在短期内,我将添加确认(ACK)以进行可靠的数据传输。我想失去的确认可能是问题,但我只是想知道,对于受过训练的人来说,它看起来是不同的问题。

超时工作需要ACK吗?

如何同步我的客户端和服务器,以便他们可以实际相互通信?

1 个答案:

答案 0 :(得分:2)

由于UDP不提供可靠性,因此您需要实现丢失数据的重传。由于它看起来像是客户端请求服务器响应模型,因此最简单的重新传输实现可能是在您等待响应超时时重新发送请求,并再次等待响应。您可能希望实现重试计数器并在重试一定次数后放弃。

如果SO_RCVTIMEOSO_SNDTIMEO套接字选项似乎没有生效,则可能是那些类型的套接字没有实现这些选项。检查setsockopt()调用的返回值以确保它们成功。

作为一种变通方法,您可以将receive_from_server()函数更改为使用poll()select()等待可读事件一段时间,而不是在{{1}中阻止}。

recvfrom()