单个服务器UDP广播,C
我创建了单个服务器和单个客户端回声应用程序。它适用于单个服务器和单个客户端。但是现在,我想通过为单个服务器处理多个客户端来使其更加实用。
以下是我的功能代码。如何对其进行修改以使单个服务器多个客户端应用程序?
服务器:
#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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论