Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何获得UDP校验和?_C_Udp - Fatal编程技术网

C 如何获得UDP校验和?

C 如何获得UDP校验和?,c,udp,C,Udp,我想从UDP中提取校验和,并将其用作另一个函数的参数。 我有下面的代码 void connection_init() { bool sender_registered = false, receiver_registered = false; int localsockfd, globalsockfd; struct sockaddr_in localaddr, globaladdr, trolladdr, senderaddr, receiveraddr, cliaddr; localso

我想从UDP中提取校验和,并将其用作另一个函数的参数。 我有下面的代码

void connection_init()
{
bool sender_registered = false, receiver_registered = false;

int localsockfd, globalsockfd;
struct sockaddr_in localaddr, globaladdr, trolladdr, senderaddr, receiveraddr, cliaddr;

localsockfd = socket(AF_INET, SOCK_DGRAM, 0);
globalsockfd = socket(AF_INET, SOCK_DGRAM, 0);

//localaddr -- This address and port is used by tcpd to receives data from local client or server process
bzero(&localaddr, sizeof(localaddr));
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(14683); 
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);

//globaladdr -- This address and port is used to communicate with troll process 
bzero(&globaladdr, sizeof(globaladdr));
globaladdr.sin_family = AF_INET;
globaladdr.sin_port = htons(14684);
globaladdr.sin_addr.s_addr = htonl(INADDR_ANY);


//trolladdr -- Troll process address
bzero(&trolladdr, sizeof(trolladdr));
trolladdr.sin_family = AF_INET;
trolladdr.sin_port = htons(14685);
inet_pton(AF_INET, "127.0.0.1", &trolladdr.sin_addr);

bind(localsockfd, (struct sockaddr *)&localaddr, sizeof(localaddr));
bind(globalsockfd, (struct sockaddr *)&globaladdr, sizeof(globaladdr));

fd_set rset;
FD_ZERO(&rset);
int maxfd1;
int len = sizeof(cliaddr);
int receivedbytes;
char buffer[1000] = {0x0};
struct message msg;
openlog(NULL, LOG_PID, LOG_USER);
int filesize = 0;
}
稍后在程序中,我将执行一个recvfrom(),如下所示:

receivedbytes = recvfrom(localsockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&cliaddr, &len);
如果我想在收到后显示校验和,我应该怎么做?

你不能。(至少不是直接的。)您也在谈论127.0.0.1:很可能UDP校验和从未被计算过(因为数据包不会进入网络,因此不会被破坏)

选项:

  • 使用SOCK_原始套接字接收:这将在接收的缓冲区中保留UDP头。不过,如上所述,如果您通过环回接口进行对话,则可能不会有UDP校验和,您必须自己处理UDP校验和验证

  • 自己计算校验和。如果校验和失败(因为内核会拒绝它),您就不会在程序中收到数据报,并且您拥有计算数据报所需的一切,因此您可以自己在接收器中重建数据报


  • 我不完全清楚为什么需要UDP校验和。它不能保证存在,而且不是一个特别强的完整性检查吗?

    有许多算法可以计算不同的“校验和”。您需要查找特定类型的校验和,还是需要为您的目的选择合适的校验和算法?请注意,UDP套接字API不公开校验和。它提供UDP的数据部分,以及可选的地址/端口(在
    cliaddr
    变量中)。我想提取服务器端数据包附带的校验和。一旦有了这些,我将在服务器端根据接收到的字节计算校验和,并将它们与我从数据包中提取的校验和进行比较。我正在学习UDP编程,并想尝试一下。啊-好的,使用原始套接字,然后自己实现UDP。没那么棘手。或者,如果您只想查看收到的校验和是什么(例如,测试您自己的计算),那么使用数据包嗅探器(如Wireshark)可能是最简单的。