我在 UDP 下创建了一个回显服务器,并且正在开发一个客户端,它将给定的文件拆分为数据包并将其传输到服务器,然后服务器返回数据包以由客户端重新组合。
发送单个数据包工作得很好。但是,我正在尝试使用 UDP_CORK 套接字选项在一个数据包中传输尽可能多的文件部分。我正在使用以下代码:
#define LINE_SIZE 80
...
// s = socket descriptor.
...
int one = 1;
int zero = 0;
setsockopt(s, IPPROTO_UDP, UDP_CORK, &one, sizeof(one)); // cork
/* Send to server, receive from server, write to new file. */
FILE *orig, *copy;
char line[LINE_SIZE];
if ((orig = fopen(input + 3, "rb")) == NULL) // original file
print_error(input);
if ((copy = fopen(filename, "wb")) == NULL) // copy of file
print_error("fopen");
while (fread(line, sizeof(char), LINE_SIZE, orig) > 0) {
if (sendto(s, line, LINE_SIZE, 0, (struct sockaddr *)&srv, len) == -1)
print_error("sendto");
}
setsockopt(s, IPPROTO_UDP, UDP_CORK, &zero, sizeof(zero)); // uncork
if (recvfrom(s, line, LINE_SIZE, 0, (struct sockaddr *)&srv, &len) == -1)
print_error("recvfrom");
fwrite(line, sizeof(char), LINE_SIZE, copy);
服务器表明它只接收一个“正常大小”的数据包,而不是我想要的软木化数据包。因此它只发回这个正常的数据包,由客户端通过 recvfrom() 调用接收。
我不确定我是否正确设置了 UDP_CORK。第二个论点正确吗?我不熟悉第二个选项的真正含义,因为手册页并不完全清楚。我也可能误解了软木塞的工作原理。
需要注意的几点:
- 我认为自己是一名中级程序员,但我几乎没有网络编程经验。
- 我意识到 UDP 不是传输文件的最佳方式。这最终将适应我正在帮助开发的不同协议。
谢谢!