#include #include #include #include #include #include #include using namespace std; bool operator<(const struct sockaddr_in &a, const struct sockaddr_in &b){ if(a.sin_addr.s_addr == b.sin_addr.s_addr) return a.sin_port < b.sin_port; return a.sin_addr.s_addr < b.sin_addr.s_addr; } set clients; int main(){ int skt = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in sad; sad.sin_port = htons(5141); sad.sin_addr.s_addr = INADDR_ANY; sad.sin_family = AF_INET; if( bind(skt, (struct sockaddr *)(&sad), sizeof(struct sockaddr_in)) ){ // step 2 perror("bind"); return 1; } char buffer[1024]; struct sockaddr_in sender_address; socklen_t sad_len = sizeof(sender_address); while(1){ /* When we get a message: * Relay to all other clients * If the message is from somebody we haven't heard of * Add them to the list of clients */ sender_address.sin_addr.s_addr = 0; sender_address.sin_port = 0; ssize_t reclen = recvfrom(skt, buffer, 1024, 0, (struct sockaddr *)&sender_address, &sad_len); buffer[reclen] = 0; printf("Received \"%s\" from %s on port %d\n", buffer, inet_ntoa(sender_address.sin_addr), ntohs(sender_address.sin_port)); if(!clients.contains(sender_address)) // O(log(n)) clients.insert(sender_address); for(const struct sockaddr_in &addr : clients) sendto(skt, buffer, reclen, 0, (struct sockaddr *)&addr, sad_len); } return 0; }