gpt4 book ai didi

客户端/服务器 : how to synchronize UDP send and receive in C?

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:04 24 4
gpt4 key购买 nike

我正在使用 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 可能是问题所在,但我只是想知道,对于受过训练的人来说,这是否像是一个不同的问题。

超时工作是否需要 ACK?

如何同步我的客户端和服务器,以便它们可以真正相互通信?

最佳答案

由于 UDP 不提供可靠性,您将需要实现丢失数据的重传。由于看起来这是一个客户端请求服务器响应模型,所以对您来说最简单的重传实现可能是在等待响应超时时重新发送请求,然后再次等待响应。您可能想要实现一个重试计数器并在一定次数的重试后放弃。

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

作为解决方法,您可以更改 receive_from_server() 函数以使用 poll()select() 等待可读事件持续一段时间,而不是在 recvfrom() 中阻塞。

ssize_t receive_from_server(rdp_socket *rsocket, char *buffer, size_t buf_len){
struct pollfd pfd = { rsocket->sockfd, POLLIN };
int pollresult = poll(&pfd, 1, RECV_TIMEOUT_SECONDS * 1000);

if (pollresult > 0) {
socklen_t sendsize = sizeof(rsocket->server_addr);
bzero(&(rsocket->server_addr), sendsize);

return recvfrom(rsocket->sockfd, buffer, buf_len, MSG_DONTWAIT,
(struct sockaddr*)&(rsocket->server_addr), &sendsize);
}

if (pollresult == 0) {
errno = ETIME;
}

return -1;
}

关于客户端/服务器 : how to synchronize UDP send and receive in C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com