SK/processes/sockets/s-inet-udp.c

68 lines
1.5 KiB
C
Raw Permalink Normal View History

2023-02-11 14:57:30 +01:00
#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;
socklen_t addr_size;
int socket_fd;
void handle_error(char *txt)
{
perror(txt);
exit(-1);
}
void receive_urgent()
{
double dd;
if (recvfrom(socket_fd, &dd, sizeof(double), MSG_OOB, (SockAddr *)&addr, &addr_size) == -1)
handle_error("recvfrom urgent");
printf("dd: %f\n", dd);
signal(SIGURG, receive_urgent);
}
int main()
{
if ((socket_fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
handle_error("socket");
addr_size = sizeof(SockAddr_in);
memset(&addr, 0, addr_size);
addr.sin_port = htons(4040);
addr.sin_family = PF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// inet_pton(AF_INET, "127.0.0.1", &(addr.sin_addr.s_addr));
if (bind(socket_fd, (SockAddr *)&addr, addr_size) == -1)
handle_error("bind");
double dd;
for (;;)
{
fcntl(socket_fd, F_SETOWN, getpid());
signal(SIGURG, receive_urgent);
int bytes = recvfrom(socket_fd, &dd, sizeof(double), 0, (SockAddr *)&addr, &addr_size);
if (bytes == -1)
handle_error("recvfrom");
if (bytes == 0)
{
printf("EOF\n");
}
printf("dd: %f\n", dd);
}
if (close(socket_fd) == -1)
handle_error("close");
return 0;
}