繁体   English   中英

如何使用UDP_CORK正确设置UDP套接字

[英]How to Properly Set up a UDP Socket using UDP_CORK

我已经在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并不是传输文件的最佳方法。 最终将根据我正在帮助开发的其他协议进行调整。

谢谢!

文件有多大? 您知道UDP数据报的大小限制为64K,对吗? 然后将超过1472字节的内容(1500字节的可用以太网有效负载减去IP报头的最小20个字节,再减去UDP报头的8个字节)进行IP分段。

然后,您将永远不会检查setsockopt(2)的返回值。 您怎么知道它成功了?

然后fread(3)告诉您读取了多少,但是您仍然尝试发送LINE_SIZE字节。 错了

暂无
暂无

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

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