#include "socket.h" #include #include int connect_udp_socket(const char* ip, uint16_t port) { #ifdef _WIN32 static int wsa_initialized = 0; if (!wsa_initialized) { WSADATA wsaData; if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed\n"); return -1; } wsa_initialized = 1; } #endif 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"); CLOSESOCKET(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"); CLOSESOCKET(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); #ifdef _WIN32 int n = sendto(sockfd, message, (int)strlen(message), 0, (const struct sockaddr*)&destaddr, sizeof(destaddr)); #else ssize_t n = sendto(sockfd, message, strlen(message), 0, (const struct sockaddr*)&destaddr, sizeof(destaddr)); #endif if (n < 0) { perror("sendto failed"); return -1; } return n; } #ifdef _WIN32 void cleanup_sockets() { WSACleanup(); } #endif