Wie sieht's aus?
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from,
socklen_t *fromlen);
Was tut's?
Mit recvfrom() empfängt man analog zu recv() Daten von einem Socket, wobei die die Absenderdaten aufgefangen werden (wieder sinnvoll für nicht-verbundene Sockets).
Was machen die Parameter?
Die ersten vier Parameter entsprechen denen von recv()
Bei den letzten beiden Parametern handelt es sich um Ergebnis-Parameter, in denen die Absenderadresse bzw. die Länge der Struktur gespeichert wird. Hier kommt wieder eine struct sockaddr_in{} zum Einsatz, die auf struct sockaddr* gecastet wird. Achtung: fromlen muß mit der Größe der Struktur vorbelegt werden.
Wenn keine Information über den Sender erwünscht ist, können die beiden letzten Parameter NULL bzw. 0 sein.
Anders als bei recv deutet ein Rückgabewert von 0 nicht auf das Beenden einer Verbindung hin! Es handelt sich um ein völlig legitimes, leeres Paket.
Wie verwende ich es?
#define BUF_SIZ 4096 /* Magische Zahlen verhindern */
...
int get_banner_from_localhost(int s)
{
char buf[BUF_SIZ];
int bytes;
struct sockaddr_in addr;
bytes = recvfrom(s, buf, sizeof(buf) - 1, 0, (struct sockaddr*) &addr, sizeof(addr));
if (bytes == -1)
{
perror("recvfrom() in get_banner() failed");
return 1;
}
buf[bytes] = '\0';
printf("Server sent \"%s\"\n", buf);
return 0;
}