Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 56 стр.

UptoLike

Составители: 

56
void write_to_server (int filedes)
{
int nbytes;
nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
if (nbytes < 0)
{
perror ("write");
exit (EXIT_FAILURE);
}
}
int main (void)
{
extern void init_sockaddr (struct sockaddr_in *name,
const char *hostname,
uint16_t port);
int sock;
struct sockaddr_in servername;
/* Create the socket. */
sock = socket (PF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
perror ("socket (client)");
exit (EXIT_FAILURE);
}
/* Connect to the server. */
init_sockaddr (&servername, SERVERHOST, PORT);
if (0 > connect (sock,
(struct sockaddr *) &servername,
sizeof (servername)))
{
perror ("connect (client)");
exit (EXIT_FAILURE);
}
/* Send data to the server. */
write_to_server (sock);
close (sock);
exit (EXIT_SUCCESS);
}
Приложение сервера является несколько более сложным. Так как необходимо
предоставить возможность нескольким клиентам подключиться к гнезду сервера, будет
некорректным просто ожидать данных от одного клиента с помощью функций read или
recv. Правильным является использование функции select для ожидания ввода от всех
открытых гнезд. В примере используется функция make_socket, определенная в
примере к базе данных протоколов.
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 5555
#define MAXMSG 512
int read_from_client (int filedes)
{
       void write_to_server (int filedes)
       {
           int nbytes;

            nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
            if (nbytes < 0)
            {
                perror ("write");
                exit (EXIT_FAILURE);
            }
       }

       int main (void)
       {
           extern void init_sockaddr (struct sockaddr_in *name,
                                      const char *hostname,
                                      uint16_t port);
           int sock;
           struct sockaddr_in servername;

            /* Create the socket. */
            sock = socket (PF_INET, SOCK_STREAM, 0);
            if (sock < 0)
            {
                perror ("socket (client)");
                exit (EXIT_FAILURE);
            }

            /* Connect to the server. */
            init_sockaddr (&servername, SERVERHOST, PORT);
            if (0 > connect (sock,
                             (struct sockaddr *) &servername,
                             sizeof (servername)))
            {
                perror ("connect (client)");
                exit (EXIT_FAILURE);
            }

            /* Send data to the server. */
            write_to_server (sock);
            close (sock);
            exit (EXIT_SUCCESS);
       }
        Приложение сервера является несколько более сложным. Так как необходимо
предоставить возможность нескольким клиентам подключиться к гнезду сервера, будет
некорректным просто ожидать данных от одного клиента с помощью функций read или
recv. Правильным является использование функции select для ожидания ввода от всех
открытых гнезд. В примере используется функция make_socket, определенная в
примере к базе данных протоколов.
       #include   
       #include   
       #include   
       #include   
       #include   
       #include   
       #include   
       #include   

       #define PORT     5555
       #define MAXMSG   512

       int read_from_client (int filedes)
       {


       56