Mình đang tìm hiểu lập trình socket trong C, mình có tìm được 1 ví dụ về UDP echo server. Ở ví dụ này server sẽ reply lại với client đã send request trước đó, bây giờ mình muốn server sẽ reply cho tất cả client đã kết nối trước đó thì phải giải quyết như thế nào nhỉ?

PHP Code:
/*
    Simple udp server
    Silver Moon (m00n.silv3r@gmail.com)
*/
#include<stdio.h>    //printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h>
#include<sys/socket.h>

#define BUFLEN 512    //Max length of buffer
#define PORT 8888    //The port on which to listen for incoming data

void die(char *s)
{
    
perror(s);
    exit(
1);
}

int main(void)
{
    
struct sockaddr_in si_mesi_other;
    
    
int sislen sizeof(si_other) , recv_len;
    
char buf[BUFLEN];
    
    
//create a UDP socket
    
if ((s=socket(AF_INETSOCK_DGRAMIPPROTO_UDP)) == -1)
    {
        die(
"socket");
    }
    
    
// zero out the structure
    
memset((char *) &si_me0sizeof(si_me));
    
    
si_me.sin_family AF_INET;
    
si_me.sin_port htons(PORT);
    
si_me.sin_addr.s_addr htonl(INADDR_ANY);
    
    
//bind socket to port
    
if( bind(, (struct sockaddr*)&si_mesizeof(si_me) ) == -1)
    {
        die(
"bind");
    }
    
    
//keep listening for data
    
while(1)
    {
        
printf("Waiting for data...");
        
fflush(stdout);
        
        
//try to receive some data, this is a blocking call
        
if ((recv_len recvfrom(sbufBUFLEN0, (struct sockaddr *) &si_other, &slen)) == -1)
        {
            die(
"recvfrom()");
        }
        
        
//print details of the client/peer and the data received
        
printf("Received packet from %s:%d\n"inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
        
printf("Data: %s\n" buf);
        
        
//now reply the client with the same data
        
if (sendto(sbufrecv_len0, (struct sockaddr*) &si_otherslen) == -1)
        {
            die(
"sendto()");
        }
    }

    
close(s);
    return 
0;

PHP Code:
/*
    Simple udp client
    Silver Moon (m00n.silv3r@gmail.com)
*/
#include<stdio.h>    //printf
#include<string.h> //memset
#include<stdlib.h> //exit(0);
#include<arpa/inet.h>
#include<sys/socket.h>

#define SERVER "127.0.0.1"
#define BUFLEN 512    //Max length of buffer
#define PORT 8888    //The port on which to send data

void die(char *s)
{
    
perror(s);
    exit(
1);
}

int main(void)
{
    
struct sockaddr_in si_other;
    
int sislen=sizeof(si_other);
    
char buf[BUFLEN];
    
char message[BUFLEN];

    if ( (
s=socket(AF_INETSOCK_DGRAMIPPROTO_UDP)) == -1)
    {
        die(
"socket");
    }

    
memset((char *) &si_other0sizeof(si_other));
    
si_other.sin_family AF_INET;
    
si_other.sin_port htons(PORT);
    
    if (
inet_aton(SERVER , &si_other.sin_addr) == 0
    {
        
fprintf(stderr"inet_aton() failed\n");
        exit(
1);
    }

    while(
1)
    {
        
printf("Enter message : ");
        
gets(message);
        
        
//send the message
        
if (sendto(smessagesizeof(message) , , (struct sockaddr *) &si_otherslen)==-1)
        {
            die(
"sendto()");
        }
        
        
//receive a reply and print it
        //clear the buffer by filling null, it might have previously received data
        
memset(buf,'\0'BUFLEN);
        
//try to receive some data, this is a blocking call
        
if (recvfrom(sbufBUFLEN0, (struct sockaddr *) &si_other, &slen) == -1)
        {
            die(
"recvfrom()");
        }
        
        
puts(buf);
    }

    
close(s);
    return 
0;