ВУЗ:
Составители:
59
BUFFER указывает область памяти, куда будут записаны считанные данные,
SIZE задает размер используемого буфера. Если пакет имеет размер, больший SIZE,
принимаются SIZE байтов, а окончание пакета теряется. Поэтому при использовании
дейтаграмм необходимо заранее знать размер передаваемых пакетов данных.
Аргументы ADDR и LENGTH-PTR указывают используются для возвращения
адреса отправителя. Если эта информация не нужна, ADDR может быть нулевым
указателем.
Возвращаемое значение и коды ошибок идентичны функции recv.
Для получения дейтаграмм могут использоваться также и функции recv и read.
Приведем примеры сервера и клиента, работающих через механизм
дейтаграмм.
Сервер ожидает прихода сообщения от клиента, а затем передает это
сообщение обратно.
В примере используется функция make_named_socket, описанная в разделе
создания гнезд в локальном пространстве имен.
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SERVER "/tmp/serversocket"
#define MAXMSG 512
int main (void)
{
extern int make_named_socket (const char *name);
int sock;
char message[MAXMSG];
struct sockaddr_un name;
size_t size;
int nbytes;
/* Remove the filename first, it's ok if the call fails */
unlink (SERVER);
/* Make the socket, then loop endlessly. */
sock = make_named_socket (SERVER);
while (1)
{
/* Wait for a datagram. */
size = sizeof (name);
nbytes = recvfrom (sock, message, MAXMSG, 0,
(struct sockaddr *) & name, &size);
if (nbytes < 0)
{
perror ("recfrom (server)");
exit (EXIT_FAILURE);
}
/* Give a diagnostic message. */
fprintf (stderr, "Server: got message: %s\n", message);
/* Bounce the message back to the sender. */
nbytes = sendto (sock, message, nbytes, 0,
(struct sockaddr *) & name, size);
if (nbytes < 0)
{
perror ("sendto (server)");
exit (EXIT_FAILURE);
BUFFER указывает область памяти, куда будут записаны считанные данные, SIZE задает размер используемого буфера. Если пакет имеет размер, больший SIZE, принимаются SIZE байтов, а окончание пакета теряется. Поэтому при использовании дейтаграмм необходимо заранее знать размер передаваемых пакетов данных. Аргументы ADDR и LENGTH-PTR указывают используются для возвращения адреса отправителя. Если эта информация не нужна, ADDR может быть нулевым указателем. Возвращаемое значение и коды ошибок идентичны функции recv. Для получения дейтаграмм могут использоваться также и функции recv и read. Приведем примеры сервера и клиента, работающих через механизм дейтаграмм. Сервер ожидает прихода сообщения от клиента, а затем передает это сообщение обратно. В примере используется функция make_named_socket, описанная в разделе создания гнезд в локальном пространстве имен. #include#include #include #include #include #define SERVER "/tmp/serversocket" #define MAXMSG 512 int main (void) { extern int make_named_socket (const char *name); int sock; char message[MAXMSG]; struct sockaddr_un name; size_t size; int nbytes; /* Remove the filename first, it's ok if the call fails */ unlink (SERVER); /* Make the socket, then loop endlessly. */ sock = make_named_socket (SERVER); while (1) { /* Wait for a datagram. */ size = sizeof (name); nbytes = recvfrom (sock, message, MAXMSG, 0, (struct sockaddr *) & name, &size); if (nbytes < 0) { perror ("recfrom (server)"); exit (EXIT_FAILURE); } /* Give a diagnostic message. */ fprintf (stderr, "Server: got message: %s\n", message); /* Bounce the message back to the sender. */ nbytes = sendto (sock, message, nbytes, 0, (struct sockaddr *) & name, size); if (nbytes < 0) { perror ("sendto (server)"); exit (EXIT_FAILURE); 59
Страницы
- « первая
- ‹ предыдущая
- …
- 57
- 58
- 59
- 60
- 61
- …
- следующая ›
- последняя »