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



我想测量每个套接字传输100MB数据文件所需的时间,因此我实现了许多套接字类型,如TCP,一些管道的映射等。

要测量的过程是(在客户端)::=在我发送数据之前,我花时间,在数据发送后,我停止时间。

(在服务器端)::=在我接收数据之前,我需要时间,在文件写入后,我再次需要时间。

问题是在服务器端,我从来没有从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 secondsn", cpu_time_used);

解决这个问题的一种方法是在缓冲区中添加一个额外的字节,该字节是一个标志,指示该数据包之后是否有更多的数据。数据较多时清除标志,数据不足时设置标志。比如:

客户:

#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控制套接字,通过它发送带外消息来指示传输何时完成,但这要复杂得多。

最新更新