C语言 UDS Dgram \ UDP套接字,同时(1)在服务器中

pftdvrlh  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(173)

我想测量每个套接字传输100 MB数据文件所需的时间,所以我实现了许多套接字类型,如TCP,一些管道的mmap等。
要测量的过程是(在客户端)::=在发送数据之前我需要时间,在发送数据之后我停止时间。
(On服务器端)::=在接收数据之前我需要时间,在写入文件之后我又需要时间。
问题是在服务器端,我从未从UDP / UDS Dgram中的while循环中退出
因此我无法测量它们之间传输数据所需的时间。
例如,这里是我的服务器的一半,而部分在UDP ipv6服务器:

clock_t start = 0, end = 0;
FILE *fp;
char *filename = "new_data.txt";
fp = fopen(filename, "w");
/* now wait until we get a datagram */
printf("waiting for a datagram...\n");
clilen = sizeof(client_addr);
start = clock();

while (1) {
    ssize_t bytes = recvfrom(sock, buffer, 1024, 0,
                             (struct sockaddr *) &client_addr,
                             &clilen);
    if (bytes < 0) {
        perror("recvfrom failed");
        exit(4);
    }
    fprintf(fp, "%s", buffer);
    bzero(buffer, 1024);

}
close(sock);
//fclose(fp);
end = clock();
double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Receive in %f seconds\n", cpu_time_used);
arknldoa

arknldoa1#

解决这个问题的一个方法是在缓冲区中增加一个额外的字节作为一个标志,用来指示在这个数据包之后是否还有数据。如果有更多的数据,则清除该标志,如果没有,则设置该标志。类似于:
委托单位:

#define CHUNK_SIZE 1024
char buffer[CHUNK_SIZE + 1] = { 0 };

while ((num_bytes = fread(buffer + 1, 1, CHUNK_SIZE, fp)) > 0)
{
    sendto(..., buffer, 1 + num_bytes, ...);
}

buffer[0] = 1;
sendto(sock, buffer, 1, ...);

伺服器:

// Same chunk size and buffer as above

while ((num_bytes = recvfrom(sock, buffer, CHUNK_SIZE + 1, ...)) > 0)
{
    if (num_bytes > 1)
    {
        fwrite(buffer + 1, 1, num_bytes - 1, fp);
    }
    if (buffer[0] == 1)
        break;
}

还有其他方法,例如同时运行一个TCP控制套接字,通过该套接字发送带外消息以指示传输何时完成,但这要复杂得多。

相关问题