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

时间:2012-05-24 20:47:37

标签: c sockets network-programming udp setsockopt

我在UDP下创建了一个echo服务器,并且正在使用一个客户端,它将给定文件分成数据包并将其传输到服务器,然后服务器返回要由客户端重新组装的数据包。

发送各个数据包的工作正常。但是,我试图使用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不是传输文件的最佳选择。这最终将适应我正在帮助开发的不同协议。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

然后fread(3)会告诉您它读了多少,但您仍尝试发送LINE_SIZE个字节。这是错误的。