【问题标题】:Reading / Writing to a socket using a FILE stream in c在 c 中使用 FILE 流读取/写入套接字
【发布时间】:2009-05-28 10:01:18
【问题描述】:

我发现了一个很好的抽象,我可以使用 FILE 从 UDP 读取数据。这非常适合读取数据,但我无法让它通过 UDP 吐出数据。下面是通过 FILE 流读取 UDP 数据的代码:

u_int8 *buf;
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in serverAddr;
if (sockfd < 0) {
  printf("Could not open socket\n");
  exit(1);
}
buf = malloc(BUF_SIZE * sizeof(u_int8));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(port);
int rc = bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (rc<0) {
  printf("Could not bind to port %d\n", port);
  exit(1);
}
/* Make sockfd blocking */
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK);

FILE *sockfile;
sockfile = (FILE*)fdopen(sockfd, "r");

现在一些其他代码可以调用:

fread(data, sizeof(u_int8), frame_payload_size, sockfile);

这很好用。但是,相反的情况似乎并非如此:

u_int8 *buf;
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in clientAddr;
if (sockfd < 0) {
  printf("Could not open socket\n");
  exit(1);
}
memset((char *)&clientAddr, 0, sizeof(clientAddr));
buf = malloc(BUF_SIZE * sizeof(u_int8));
clientAddr.sin_family = AF_INET;
clientAddr.sin_port = htons(port);
if (inet_aton("127.0.0.1", &clientAddr.sin_addr)==0) {
  printf("inet_aton()\n");
  abort();
}
int rc = bind(sockfd, (struct sockaddr *)&clientAddr, sizeof(clientAddr));
FILE *sockfile;
sockfile = (FILE*)fdopen(sockfd, "w");

其他一些代码会调用:

written = fwrite(fm->frame, sizeof(u_int8), fm->frame_length, data_out_stream);

'written' 将返回写入的正数元素,但似乎没有生成 UDP 数据包。

我正在尝试做的事情可能吗?关于为什么它可能不起作用的任何建议?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    刷新文件。仅当网络数据包已满或强制刷新时才会生成网络数据包。因此,除非您写入超过 1500 字节(默认值,包括标头字段),否则计算机将等待交付。

    【讨论】:

      【解决方案2】:

      您并没有隐藏信息,这可能很酷,但是您向另一段代码提供了虚假信息,即您的套接字表现得像一个流。我认为你应该坚持读/写调用,否则你会发现自己有一个leaky abstraction

      【讨论】:

        【解决方案3】:

        这实际上很奇怪。使用 fflush(),或者更好的是,使用 send() 而不是 fwrite() 并丢弃 FILE。由于 FILE 对象如何缓冲的语义以及数据报如何无法保证按顺序到达/根本到达,您将遇到意外行为,这可能导致消息乱码。除非您使用的是 UNIX 套接字。

        【讨论】:

          猜你喜欢
          • 2011-05-25
          • 2017-07-22
          • 1970-01-01
          • 2013-05-06
          • 2013-11-27
          • 1970-01-01
          • 1970-01-01
          • 2019-03-20
          • 1970-01-01
          相关资源
          最近更新 更多