#include "socket.h" // ========================= // UDP SOCKET FUCNTIONS // ========================= // @param ip: IP address to connect to // @param port: Port number to connect to // @return: Socket file descriptor, or -1 on error int connect_udp_socket(const char* ip, uint16_t port) { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket creation failed"); 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("connection to the server failed"); close(sockfd); return -1; } return sockfd; } int bind_udp_socket(int sockfd, const char* ip, uint16_t port) { struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr(ip); servaddr.sin_port = htons(port); if (bind(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) { perror("bind failed"); close(sockfd); return -1; } return 0; } 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; } return n; }