2010-09-07 6 views
1

Более чем вероятно вопрос новобранец, но я ищу функцию printf -esque для использования в send через TCP-сокеты. Это для простого чат-сервера, в частности модифицированной версии той, что находится в руководстве для сокета Beej. Я готов написать свое, но прежде чем я сделаю, я хочу убедиться, что я не изобретаю колесо.Есть ли fprintf для отправки?

Я ищу что-то родное для C, а не библиотеку или что-то в этом роде. Я делаю это как интеллектуальное преследование, и использование готовой библиотеки не будет учить меня так же, как испортить, пока я не получу это правильно и не пойму, почему.

Оценка за каждого, кто отвечает!

Edit: настоящее время я использую:

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

Интересно. Есть ли какие-либо «gotchas», связанные с этим вне типов, которые вы можете найти, работая с обычными файлами? Скоростные удары или тому подобное? Изменить: например, send требует от меня цикла с ним, пока не будет отправлено полное содержимое, не так ли? Это относится к fprintf таким образом? – Codeacula

+1

Предполагая, что это потоковое сокет в режиме блокировки, fprintf позаботится о любых циклах, которые необходимы. Единственная «gotcha» - это если вы используете Windows; в Windows сокеты не являются файловыми дескрипторами, как на каждой другой ОС. – mark4o

+0

Спасибо, mark4o. И как продолжение, делает это медленнее, чем использование send/recv напрямую? Это заметная разница? – Codeacula

1

Я предполагаю, что вы будете использовать snprintf (безопаснее, чем sprintf) в буфер и send, что ...

Вы могли бы, конечно, обернуть это в миленькой функции variadac.

+0

Это то, что я сейчас использую, просто любопытно, если есть специально разработанный для отправки. Я думал, так как есть fprintf, может быть один для сокетов. – Codeacula

+1

Ориентированный на поток доступ к файлу делает его разумным сделать другую реализацию printf для этого конкретного использования. в случае отправки вы должны заполнить буфер в любом случае. Отправка даже позволяет повторно использовать этот буфер для обоих. 'fprintf' не для удобства программистов, это фактическая оптимизация пространства/производительности. – SingleNegationElimination

+1

Библиотека сокетов отправляет стандартную библиотеку c, поэтому ее не было в начале, и кажется, что ни один комитет не счел нужным включить ее с тех пор (и это правильный выбор, файлы почти универсальны, сокеты - это просто очень, очень распространенный). – dmckee

Смежные вопросы