91 lines
2.5 KiB
C

#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;
}