112 lines
2.4 KiB
C
112 lines
2.4 KiB
C
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <string.h>
|
|
#include <arpa/inet.h>
|
|
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
|
|
typedef struct sockaddr_in SockAddr_in;
|
|
typedef struct sockaddr SockAddr;
|
|
|
|
SockAddr_in addr;
|
|
SockAddr_in addr_client;
|
|
socklen_t addr_size;
|
|
int socket_fd;
|
|
int client_socket;
|
|
|
|
void handle_error(char *txt)
|
|
{
|
|
perror(txt);
|
|
exit(-1);
|
|
}
|
|
|
|
void receive_urgent(int signo)
|
|
{
|
|
double dd;
|
|
printf("OOB received\n");
|
|
if (recv(client_socket, &dd, sizeof(double), MSG_OOB) == -1)
|
|
handle_error("recv urgent");
|
|
printf("urgent dd: %f\n", dd);
|
|
|
|
signal(SIGURG, receive_urgent);
|
|
}
|
|
|
|
void end_connection()
|
|
{
|
|
if (close(socket_fd) == -1)
|
|
handle_error("close");
|
|
exit(0);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
signal(SIGINT, end_connection);
|
|
signal(SIGTERM, end_connection);
|
|
|
|
if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
|
|
handle_error("socket");
|
|
printf("socket success\n");
|
|
|
|
addr_size = sizeof(SockAddr_in);
|
|
memset(&addr, 0, addr_size);
|
|
addr.sin_port = htons(4040);
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
|
|
if (bind(socket_fd, (SockAddr *)&addr, addr_size) == -1)
|
|
handle_error("bind");
|
|
printf("bind success\n");
|
|
|
|
if (listen(socket_fd, 10) == -1)
|
|
handle_error("listen");
|
|
printf("listen success\n");
|
|
|
|
double dd;
|
|
for (;;)
|
|
{
|
|
if ((client_socket = accept(socket_fd, (SockAddr *)&addr_client, &addr_size)) == -1)
|
|
handle_error("accept");
|
|
printf("accept success\n");
|
|
|
|
int i;
|
|
if ((i = fork()) == -1)
|
|
handle_error("fork");
|
|
printf("fork success\n");
|
|
if (i == 0)
|
|
{
|
|
close(socket_fd);
|
|
signal(SIGURG, receive_urgent);
|
|
fcntl(client_socket, F_SETOWN, getpid());
|
|
|
|
for (;;)
|
|
{
|
|
int bytes = read(client_socket, &dd, sizeof(double));
|
|
if (bytes == -1)
|
|
handle_error("recvfrom");
|
|
if (bytes == 0)
|
|
{
|
|
printf("EOF\n");
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
printf("dd: %f\n", dd);
|
|
}
|
|
}
|
|
|
|
close(client_socket);
|
|
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
sigignore(SIGCHLD);
|
|
close(client_socket);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
} |