SK/processes/sockets/surg.c

135 lines
4.0 KiB
C
Raw Normal View History

2023-02-11 14:57:30 +01:00
/*
Serwer strumieniowy, internetowy z danymi wysoko priorytetowymi.
*/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <fcntl.h>
typedef struct sockaddr SockAddr;
typedef struct sockaddr_in SockAddr_in;
int gniazdo, gniazdo1;
void al(int i)
{
if (i == SIGTERM || i == SIGINT)
{
printf("Koniec pracy serwera.\n");
close(gniazdo);
exit(0);
}
}
void sig_urg(int signo)
{
size_t n;
double dd;
printf("Przechwycony sygnal SIGURG.\n");
n = recv(gniazdo1, &dd, sizeof(double), MSG_OOB);
printf("Przecztalem %lu OOB bajtow: %f.\n", n, dd);
}
int main(int argc, char *argv[])
{
socklen_t i;
SockAddr_in adres, adres_k;
signal(SIGTERM, al);
signal(SIGINT, al);
sigignore(SIGCHLD);
if ((gniazdo = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
perror("Blad wywolania funkcji socket.\n");
return -1;
}
else
{
i = sizeof(SockAddr_in);
adres.sin_family = AF_INET;
if (argc > 1)
{
adres.sin_port = htons(strtol(argv[1], NULL, 10));
}
else
{
adres.sin_port = htons(0);
}
adres.sin_port = htons(4040);
adres.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(gniazdo, (SockAddr *)&adres, i) < 0)
{
perror("Blad dowiazania gniazda.\n");
close(gniazdo);
return -1;
}
else
{
if (getsockname(gniazdo, (SockAddr *)&adres, &i) != 0)
{
perror("Blad funkcji getsockname.\n");
close(gniazdo);
return -1;
}
else
{
printf("Nr portu : %d.\n", ntohs(adres.sin_port));
if (listen(gniazdo, 5) < 0)
{
perror("Blad nasluchu gniazda.\n");
close(gniazdo);
return -1;
}
else
{
for (;;)
{
if ((gniazdo1 = accept(gniazdo, (SockAddr *)&adres_k, &i)) < 0)
{
perror("Blad funkcji accept.\n");
continue;
}
else
{
if (fork() == 0)
{
pid_t t;
size_t n;
double dd;
char buf[100];
close(gniazdo);
signal(SIGURG, sig_urg);
fcntl(gniazdo1, F_SETOWN, getpid());
printf("Polaczenie od %s z portu %d.\n", inet_ntoa(adres_k.sin_addr),
ntohs(adres_k.sin_port));
for (;;)
{
if ((n = read(gniazdo1, &dd, sizeof(double))) == 0)
{
printf("Koniec transmisji klienta.\n");
close(gniazdo1);
break;
}
// buf[n] = 0;
printf("Przeczytalem %lu bajtow: %f.\n", n, dd);
}
printf("Koniec pracy procesu potomnego.\n");
return 0;
}
else
{
sigignore(SIGCHLD);
close(gniazdo1);
}
}
}
}
}
}
}
}