aboutsummaryrefslogtreecommitdiff
path: root/Semestr 4/sieci/pracownia2/router/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'Semestr 4/sieci/pracownia2/router/utils.c')
-rw-r--r--Semestr 4/sieci/pracownia2/router/utils.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/Semestr 4/sieci/pracownia2/router/utils.c b/Semestr 4/sieci/pracownia2/router/utils.c
index 9f008eb..2872a35 100644
--- a/Semestr 4/sieci/pracownia2/router/utils.c
+++ b/Semestr 4/sieci/pracownia2/router/utils.c
@@ -21,10 +21,12 @@ void bind_to_port(int sockfd, uint16_t port) {
server_address.sin_family = AF_INET;
server_address.sin_port = htons(port);
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
+
if (bind(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
fprintf(stderr, "Bind error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
+
int broadcastPermission = 1;
setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST, (void *)&broadcastPermission, sizeof(broadcastPermission));
}
@@ -38,16 +40,17 @@ int poll_socket_modify_timeout(int sockfd, int *timeout) {
fprintf(stderr, "poll_modify_timeout: timeout is negative.\n");
exit(EXIT_FAILURE);
}
-
+
struct pollfd fds;
+ struct timespec start;
+ struct timespec finish;
+
fds.fd = sockfd;
fds.events = POLLIN;
fds.revents = 0;
-
- struct timespec start;
clock_gettime(CLOCK_REALTIME, &start);
- int result = poll(&fds, 1, *timeout);
+ int result = poll(&fds, 1, *timeout);
if (result == -1) {
fprintf(stderr, "poll error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
@@ -56,15 +59,14 @@ int poll_socket_modify_timeout(int sockfd, int *timeout) {
*timeout = 0;
return 0;
}
- struct timespec finish;
+
clock_gettime(CLOCK_REALTIME, &finish);
*timeout -= get_time_interval(start, finish);
printf("Timeout: %dms, time waiting: %ldms.\n", *timeout, get_time_interval(start, finish));
return result;
}
-/* For debug purposes only */
-void recv_and_print(int sockfd, int networks_number, struct router_addr *networks) {
+void recv_and_print(int sockfd, int networks_number, struct network_addr *networks) {
struct sockaddr_in sender;
socklen_t sender_len = sizeof(sender);
uint8_t buffer[IP_MAXPACKET + 1];
@@ -87,4 +89,14 @@ void recv_and_print(int sockfd, int networks_number, struct router_addr *network
buffer[datagram_len] = 0;
printf("%ld-byte message: +%s+\n", datagram_len, buffer);
-} \ No newline at end of file
+}
+
+size_t send_message(int sockfd, char *buffer, int buffer_len, struct in_addr network) {
+ struct sockaddr_in network_address;
+ bzero (&network_address, sizeof(network_address));
+ network_address.sin_family = AF_INET;
+ network_address.sin_port = htons(SERVER_PORT);
+ network_address.sin_addr = network;
+
+ return sendto(sockfd, buffer, buffer_len, 0, (struct sockaddr*) &network_address, sizeof(network_address));
+}