gpt4 book ai didi

c - 使用c中的FILE流读取/写入套接字

转载 作者:行者123 更新时间:2023-12-03 11:52:41 25 4
gpt4 key购买 nike

我发现了一个很好的抽象,我可以使用 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 数据包。

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

最佳答案

刷新文件。网络数据包仅在它们已满或强制刷新时生成。所以除非你写的字节数超过 1500 字节(默认,包括头域),计算机会等待传递。

关于c - 使用c中的FILE流读取/写入套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/920106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com