#include "socket.h" // ========================= // UDP SOCKET FUCNTIONS // ========================= // Create a UDP socket // @return: Socket file descriptor, or -1 on error int create_udp_socket(void) { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("[!] socket() failed"); return -1; } return sockfd; } // Create a UDP socket and connect it to a specific IP and port // Used for sending data (no bind needed) // @param ip: Destination IP address as a string // @return: Socket file descriptor, or -1 on error int connect_udp_socket(const char *ip, uint16_t port) { int sockfd = create_udp_socket(); if (sockfd < 0) return -1; struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(port); servaddr.sin_addr.s_addr = inet_addr(ip); if (connect(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("[!] connect() failed"); close(sockfd); return -1; } printf("[+] Connected UDP socket to %s:%d\n", ip, port); return sockfd; } // Create and bind a UDP socket to a local IP and port // Used for listening for incoming data // @param ip: Local IP address to bind to // @param port: Local port to bind to // @return: Socket file descriptor, or -1 on error int create_bound_udp_socket(const char *ip, uint16_t port) { int sockfd = create_udp_socket(); if (sockfd < 0) return -1; struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = inet_addr(ip); if (bind(sockfd, (const struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("[!] bind() failed"); close(sockfd); return -1; } printf("[+] Bound UDP socket on %s:%d\n", ip, port); return sockfd; } // Send a UDP message to the specified IP and port // @param sockfd: Socket file descriptor // @param message: Message to send // @param dest_ip: Destination IP address as a string // @param dest_port: Destination port // @return: Number of bytes sent, or -1 on error ssize_t send_udp_message(int sockfd, const char *message, const char *dest_ip, uint16_t dest_port) { struct sockaddr_in destaddr; memset(&destaddr, 0, sizeof(destaddr)); destaddr.sin_family = AF_INET; destaddr.sin_port = htons(dest_port); destaddr.sin_addr.s_addr = inet_addr(dest_ip); ssize_t n = sendto(sockfd, message, strlen(message), 0, (const struct sockaddr *)&destaddr, sizeof(destaddr)); if (n < 0) { perror("[!] sendto() failed"); return -1; } printf("[+] Sent %zd bytes to %s:%d\n", n, dest_ip, dest_port); return n; }