generated from AfonsoCMSousa/CPP-Template
91 lines
2.5 KiB
C
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;
|
|
}
|