单个服务器UDP广播,C

发布于 2025-01-23 12:33:00 字数 3770 浏览 1 评论 0原文

我创建了单个服务器和单个客户端回声应用程序。它适用于单个服务器和单个客户端。但是现在,我想通过为单个服务器处理多个客户端来使其更加实用。

以下是我的功能代码。如何对其进行修改以使单个服务器多个客户端应用程序?

服务器:

#define BUFFER_SIZE 65507 
int main(int argc, char *argv[]){
    int idSocket, puerto;
    struct sockaddr_in server;
    struct sockaddr_in cliente;
    const int broadcastEnable=1;
    char name[30];
    char bufferRec[BUFFER_SIZE]; 
    char bufferEnv[BUFFER_SIZE]; 
    int rcb=0, envio =0;
    if(argc != 2){
        printf("Ingresa el puerto/n");
        exit(-1);
    }
    puerto = atoi(argv[1]);
    server.sin_family = AF_INET;
    server.sin_port = htons(puerto);
    server.sin_addr.s_addr = inet_addr("127.0.0.255");
   
    idSocket = socket(AF_INET,SOCK_DGRAM,0);
    if(idSocket == -1){
        printf("No se pudo crear el socket/n");
    }
    if(setsockopt(idSocket,SOL_SOCKET,SO_BROADCAST,(char*)&broadcastEnable,sizeof(broadcastEnable)) == -1){
        printf("No se pudo crear el broadcast/n");
        exit(-1);
    }

    if(bind(idSocket,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1){
        printf("Error en el bind()\n");
        exit(-1);
    }
    while(1){
        socklen_t tam = sizeof(cliente);
        if((rcb=recvfrom(idSocket,bufferRec,sizeof(bufferRec),0,(struct sockaddr*)&cliente,&tam))==-1){
            printf("Error en el recv()\n");
            exit(-1);
        }
        printf("El cliente envio: %s\n",bufferRec);
        cliente.sin_addr.s_addr = INADDR_BROADCAST;
        strcpy(bufferEnv,"Hola desde el server");
        if((envio=sendto(idSocket,bufferEnv,sizeof(bufferEnv),0,(struct sockaddr*)&cliente,sizeof(cliente)))==-1){
            perror("Error en el sendto()\n");
            exit(-1);
        }
        printf("Enviamos: %s\n",bufferEnv);
    }
    close(idSocket);
}

客户端:

#define BUFFER_SIZE 65507 
int main(int argc, char *argv[]){
    int idSocket, puerto, puerto_server;
    char name[30];
    int rcb=0;
    int envio;
    struct sockaddr_in server; 
    struct sockaddr_in cliente;
    char bufferRec[BUFFER_SIZE];
    const int broadcastEnable=1; 
    char bufferEnv[BUFFER_SIZE];
    if(argc != 3){
        printf("Ingresa el puerto del servidor/n");
        exit(-1);
    }

    
    puerto = atoi(argv[1]);
    puerto_server = atoi(argv[2]);
   
    memset((char*)&server,0,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(puerto_server);
    server.sin_addr.s_addr = inet_addr("127.0.0.255");
    
    cliente.sin_family = AF_INET;
    cliente.sin_port = htons(puerto);
    cliente.sin_addr.s_addr = INADDR_ANY;

    idSocket = socket(AF_INET,SOCK_DGRAM,0);
    if(idSocket == -1){
        printf("No se pudo crear el socket\n");
        exit(-1);
    }
    if(setsockopt(idSocket,SOL_SOCKET,SO_BROADCAST,(char*)&broadcastEnable,sizeof(broadcastEnable)) == -1){
        printf("No se pudo crear el broadcast/n");
        exit(-1);
    }

    if(bind(idSocket,(struct sockaddr*)&cliente, sizeof(struct sockaddr))==-1){
        printf("Error en el bind()\n");
        exit(-1);
    }
    while(1){
        
        strcpy(bufferEnv,"Hola desde el cliente");
        if((envio=sendto(idSocket,bufferEnv,sizeof(bufferEnv),0,(struct sockaddr*)&server,sizeof(server)))==-1){
            perror("Error en el sendto()\n");
            exit(-1);
        }
        printf("Enviamos: %s\n",bufferEnv);
        socklen_t tam = sizeof(server);
        if((rcb=recvfrom(idSocket,bufferRec,sizeof(bufferRec),0,(struct sockaddr*)&server,&tam))==-1){
            printf("Error en el recv()\n");
            exit(-1);
        }
        printf("El servidor envio: %s\n",bufferRec);
    }
    close(idSocket);
}

I have created single server and single client echo application. It works fine for single server and single client. But now I want to make it more practical by handling multiple clients for a single server.

Below is my functional code. How can I modify it to make a single server multiple clients application?

Server:

#define BUFFER_SIZE 65507 
int main(int argc, char *argv[]){
    int idSocket, puerto;
    struct sockaddr_in server;
    struct sockaddr_in cliente;
    const int broadcastEnable=1;
    char name[30];
    char bufferRec[BUFFER_SIZE]; 
    char bufferEnv[BUFFER_SIZE]; 
    int rcb=0, envio =0;
    if(argc != 2){
        printf("Ingresa el puerto/n");
        exit(-1);
    }
    puerto = atoi(argv[1]);
    server.sin_family = AF_INET;
    server.sin_port = htons(puerto);
    server.sin_addr.s_addr = inet_addr("127.0.0.255");
   
    idSocket = socket(AF_INET,SOCK_DGRAM,0);
    if(idSocket == -1){
        printf("No se pudo crear el socket/n");
    }
    if(setsockopt(idSocket,SOL_SOCKET,SO_BROADCAST,(char*)&broadcastEnable,sizeof(broadcastEnable)) == -1){
        printf("No se pudo crear el broadcast/n");
        exit(-1);
    }

    if(bind(idSocket,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1){
        printf("Error en el bind()\n");
        exit(-1);
    }
    while(1){
        socklen_t tam = sizeof(cliente);
        if((rcb=recvfrom(idSocket,bufferRec,sizeof(bufferRec),0,(struct sockaddr*)&cliente,&tam))==-1){
            printf("Error en el recv()\n");
            exit(-1);
        }
        printf("El cliente envio: %s\n",bufferRec);
        cliente.sin_addr.s_addr = INADDR_BROADCAST;
        strcpy(bufferEnv,"Hola desde el server");
        if((envio=sendto(idSocket,bufferEnv,sizeof(bufferEnv),0,(struct sockaddr*)&cliente,sizeof(cliente)))==-1){
            perror("Error en el sendto()\n");
            exit(-1);
        }
        printf("Enviamos: %s\n",bufferEnv);
    }
    close(idSocket);
}

Client:

#define BUFFER_SIZE 65507 
int main(int argc, char *argv[]){
    int idSocket, puerto, puerto_server;
    char name[30];
    int rcb=0;
    int envio;
    struct sockaddr_in server; 
    struct sockaddr_in cliente;
    char bufferRec[BUFFER_SIZE];
    const int broadcastEnable=1; 
    char bufferEnv[BUFFER_SIZE];
    if(argc != 3){
        printf("Ingresa el puerto del servidor/n");
        exit(-1);
    }

    
    puerto = atoi(argv[1]);
    puerto_server = atoi(argv[2]);
   
    memset((char*)&server,0,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(puerto_server);
    server.sin_addr.s_addr = inet_addr("127.0.0.255");
    
    cliente.sin_family = AF_INET;
    cliente.sin_port = htons(puerto);
    cliente.sin_addr.s_addr = INADDR_ANY;

    idSocket = socket(AF_INET,SOCK_DGRAM,0);
    if(idSocket == -1){
        printf("No se pudo crear el socket\n");
        exit(-1);
    }
    if(setsockopt(idSocket,SOL_SOCKET,SO_BROADCAST,(char*)&broadcastEnable,sizeof(broadcastEnable)) == -1){
        printf("No se pudo crear el broadcast/n");
        exit(-1);
    }

    if(bind(idSocket,(struct sockaddr*)&cliente, sizeof(struct sockaddr))==-1){
        printf("Error en el bind()\n");
        exit(-1);
    }
    while(1){
        
        strcpy(bufferEnv,"Hola desde el cliente");
        if((envio=sendto(idSocket,bufferEnv,sizeof(bufferEnv),0,(struct sockaddr*)&server,sizeof(server)))==-1){
            perror("Error en el sendto()\n");
            exit(-1);
        }
        printf("Enviamos: %s\n",bufferEnv);
        socklen_t tam = sizeof(server);
        if((rcb=recvfrom(idSocket,bufferRec,sizeof(bufferRec),0,(struct sockaddr*)&server,&tam))==-1){
            printf("Error en el recv()\n");
            exit(-1);
        }
        printf("El servidor envio: %s\n",bufferRec);
    }
    close(idSocket);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文