2010-09-07 52 views
1

很可能是一个菜鸟问题,但我正在寻找一个printf -esque函数,用于在TCP套接字上使用send。这是一个简单的聊天服务器,特别是Beej插座指南中的修改版本。我准备写我自己的,但在我做之前我想确保我没有重新发明轮子。是否有发送的fprintf?

我正在寻找C原生的东西,而不是图书馆或其他东西。我这样做是为了追求智力,使用现成的图书馆不会让我感到困惑,直到我明白为什么。

提前感谢所有回答问题的人!

编辑: 我目前使用:

if(current_user->fs_id == sending_user->fs_id) { 
    snprintf(server->current_buffer, buffer_size, "You said: %s", message); 
} else { 
    snprintf(server->current_buffer, buffer_size, "%s said: %s", sending_user->name, message); 
} 

if(send(current_user->fs_id, server->current_buffer, buffer_size, 0) == -1) { 
    perror("Sending data"); 
} 

我明白这不是做的最好的方式,这就是我现在固定的一部分。

回答

4

使用fdopen来制作一个FILE *对应的套接字,然后fprintf写入它。

+0

有趣。在你使用普通文件的类型之外,是否存在与此相关的“陷阱”?速度命中还是类似的?编辑:例如,发送要求我循环它,直到完整的内容发送,对吧?这是否适用于fprintf这种方式? – Codeacula 2010-09-07 02:24:59

+1

假设它是阻塞模式下的流套接字,fprintf将负责所需的任何循环。唯一的“难题”是如果你使用Windows;在Windows上,套接字不是文件描述符,因为它们位于每个其他操作系统上。 – mark4o 2010-09-07 02:50:11

+0

谢谢,mark4o。作为后续,比使用send/recv直接做得慢吗?这是一个显着的差异? – Codeacula 2010-09-07 02:58:54

1

我认为你会使用snprintf(较安全sprintf)到缓冲区和send那......

你可以,当然,在一个可爱的小variadac功能包这件事。

+0

这就是我现在使用的,只是好奇,如果有一个专门为发送量身定做。我想因为有一个fprintf可能有一个套接字。 – Codeacula 2010-09-07 01:14:30

+1

文件访问的面向流的特性使得为特定用途制作不同的printf实现变得明智。在发送的情况下,无论如何您都必须填写缓冲区。发送甚至可以让你重用这个缓冲区。 'fprintf'不适合程序员的方便,它是一个实际的空间/性能优化。 – SingleNegationElimination 2010-09-07 01:17:11

+1

套接字库在c标准库后发布,所以它在开始时并不存在,似乎没有委员会认为可以包含它(因为这是正确的选择,文件几乎是通用的,套接字是只是非常非常普遍)。 – dmckee 2010-09-07 01:19:11

相关问题