2010-09-07 40 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

相關問題