繁体   English   中英

如何在C语言的UDP客户端/服务器中为sento和recvfrom添加延迟

[英]How to add delay to sento and recvfrom in UDP client/server in C

对于学校的编程项目,我们必须使用tcp协议和udp协议设计基本的客户端/服务器设置。 我已经使用来自C Socket库的read()和write()来使用TCP。 我现在需要创建一个“可靠的UDP”系统。 例如:

“当服务器收到长度消息时,它将等待最多500毫秒的时间来发送该字节数。如果它收到正确的字节数,它将响应一个包含字符”ACK“的字符串(一个常见的缩写)如果在超时期限结束时没有收到正确的字节数,服务器将放弃并静默退出。“

我设置了sendto()和recvfrom()函数,但我不知道如何执行超时功能,以便它只等待500ms才能发送第二个msg。 如果它没有收到“ACK”并重新发送msg + msg的长度,我也必须稍后在客户端执行此操作。 怎么办超时?

在程序中添加以下函数并使用它而不是直接使用recvfrom函数。

以下functiong具有相同的recvfrom函数输入参数+最后一个超时输入参数

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

int timeout_recvfrom (int sock, char *buf, int *length, struct sockaddr_in *connection, int timeoutinseconds)
{
    fd_set socks;
    struct timeval t;
    FD_ZERO(&socks);
    FD_SET(sock, &socks);
    t.tv_sec = timeoutinseconds;
    if (select(sock + 1, &socks, NULL, NULL, &t) &&
        recvfrom(sock, buf, *length, 0, (struct sockaddr *)connection, length)!=-1)
        {
        return 1;
        }
    else
        return 0;
}

不使用select或poll的替代方法是使用套接字选项SO_RCVTIMEO和SO_SNDTIMEO

tv.tv_sec = 10; /* seconds */
tv.tv_usec = 0;

if(setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0)
        printf("Cannot Set SO_SNDTIMEO for socket\n");

if(setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
        printf("Cannot Set SO_RCVTIMEO for socket\n");

SO_RCVTIMEO和SO_SNDTIMEO套接字选项

如果您有一个可以读取或写入的插槽,那么这是一个更好的选择。 如果您使用多个套接字并希望继续使用完全发送/接收数据的套接字,则可能选择更合适。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM