2010-09-07 6 views
1

Plus que probablement une question novice, mais je suis à la recherche d'une printf -sque fonction à utiliser dans send sur les sockets TCP. Ceci est pour un simple serveur de discussion, en particulier une version modifiée de celle du guide de socket de Beej. Je suis prêt à écrire le mien, mais avant je veux m'assurer que je ne réinvente pas la roue.Y a-t-il un fprintf pour envoyer?

Je cherche quelque chose d'indigène à C, pas une bibliothèque ou quelque chose. Je fais cela en tant que poursuite intellectuelle, et l'utilisation d'une bibliothèque prête à l'emploi ne va pas m'apprendre aussi bien que de me tromper jusqu'à ce que je comprenne bien pourquoi.

Appréciation à l'avance pour ceux qui répondent!

Edit: Je suis actuellement en utilisant:

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"); 
} 

Je comprends que ce n'est pas la meilleure façon de le faire, cela fait partie de ce que je suis maintenant la fixation.

Répondre

4

Utilisez fdopen pour créer un FILE * correspondant à la prise, puis fprintf pour y écrire.

+0

Intéressant. Y a-t-il des "gotchas" associés à cela en dehors des types que vous pourriez trouver en travaillant avec des fichiers normaux? Coups de vitesse ou similaires? Edit: Par exemple, envoyer nécessite que je boucle avec jusqu'à ce que le contenu complet est envoyé, non? Est-ce que cela s'applique avec fprintf de cette manière? – Codeacula

+1

En supposant qu'il s'agit d'une socket de flux en mode bloquant, fprintf prendra en charge toute boucle nécessaire. Le seul "gotcha" est si vous utilisez Windows; Sous Windows, les sockets ne sont pas des descripteurs de fichiers comme sur tous les autres systèmes d'exploitation. – mark4o

+0

Merci, mark4o. Et en tant que suivi, est-ce que c'est plus lent que d'utiliser send/recv directement? Est-ce une différence notable? – Codeacula

1

Je suppose que vous utilisez snprintf (plus sûr que sprintf) dans un tampon et send que ...

Vous pourriez bien sûr, envelopper cela dans une jolie petite fonction variadac.

+0

C'est ce que j'utilise maintenant, juste curieux s'il y en a un spécialement conçu pour l'envoi. Je pensais qu'il y avait un fprintf, il pourrait y en avoir un pour les sockets. – Codeacula

+1

La nature orientée flux de l'accès aux fichiers rend judicieuse la réalisation d'une implémentation printf différente pour cette utilisation spécifique. dans le cas d'envoyer, vous devez remplir un tampon dans tous les cas. Envoyer permet même de réutiliser ce tampon pour les deux. 'fprintf' n'est pas pour la commodité du programmeur, c'est une réelle optimisation de l'espace/performance. – SingleNegationElimination

+1

La bibliothèque de sockets post-date la bibliothèque standard c, donc il n'était pas là au début, et il semble qu'aucun comité n'a jugé bon de l'inclure depuis (et c'est le bon choix, les fichiers sont presque universels, les sockets sont simplement très, très commun). – dmckee

Questions connexes