Enviar mensagem de confirmação do pc2 para pc1 por unicast
Bom dia, tenho este código feito, em que o trabalho é enviar uma mensagem do pc1 para o pc3, com um interlocutor no meio (pc2). Quando o pc2 recebe mensagem do pc1, envia ao pc1 confirmação de recebimento de mensagem. Quando o pc3 recebe a mensagem, envia para o pc2 a confirmação que por sua vez envia para o pc1. O envio da mensagem do pc2 para o pc3 é via broadcast. Tudo o resto é unicast, contudo no meu código tenho o envio da confirmação do pc2 para o pc1 também por broadcast. Será que a única coisa que tenho a fazer é mudar no código do pc2 um valor do argv[] e o porto? Obrigado.
código do pc2:
[code=c][/#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); }
#define MAX_BUFFER 512
int main(int argc, char* argv[])
{
int sock, length, fromlen, r, send_sock, sendlen, V = 1, n; //int n declarado
struct sockaddr_in SERVER_ADDR;
struct sockaddr_in FROM_ADDR;
struct sockaddr_in SENDTO_ADDR;
//struct sockaddr_in LOCALMENTE_addr;
char buf[MAX_BUFFER];
//verifica argumentos
if (argc != 5)
{
printf("USAGE: %s <a.porto> <ip_broadcast> <c.porto> <b.porto>\\n",argv[0]);
exit(1);
}
//cria socket UDP
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0) printf("SOCKET");
length = sizeof(SERVER_ADDR);
bzero(&SERVER_ADDR, length);
SERVER_ADDR.sin_family = AF_INET;
SERVER_ADDR.sin_addr.s_addr = INADDR_ANY;
SERVER_ADDR.sin_port = htons(atoi(argv[1]));
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &V, sizeof(V));
sendlen = sizeof(SENDTO_ADDR);
bzero(&SENDTO_ADDR, sendlen);
SENDTO_ADDR.sin_family = AF_INET;
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[3]));
if(bind(sock, (struct sockaddr *)&SERVER_ADDR,length) < 0) printf("BIND: ");
fromlen = sizeof(struct sockaddr_in);
while(1)
{
printf("Wait for the next message...!\\n");
bzero(&buf, MAX_BUFFER);
n = recvfrom(sock,buf,MAX_BUFFER,0,(struct sockaddr *) &FROM_ADDR, &fromlen);
if (strstr(buf,"Confirma")){
printf("Mensagem recebida: [%s], bytes recebidos: [%d]\\n",buf,n);
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[4]));
n = sendto (sock, buf,MAX_BUFFER,0,(struct sockaddr *) &SENDTO_ADDR, sendlen);
}
else{
printf("Mensagem recebida: [%s], bytes recebidos: [%d]\\n",buf,n);
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[3]));
n = sendto (sock, buf,MAX_BUFFER,0,(struct sockaddr *) &SENDTO_ADDR, sendlen);
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[4]));
strcpy(buf," Confirmado interlocutor. ");
n = sendto (sock, buf,MAX_BUFFER,0,(struct sockaddr *) &SENDTO_ADDR, sendlen);
}
}
}]
código do pc2:
[code=c][/#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); }
#define MAX_BUFFER 512
int main(int argc, char* argv[])
{
int sock, length, fromlen, r, send_sock, sendlen, V = 1, n; //int n declarado
struct sockaddr_in SERVER_ADDR;
struct sockaddr_in FROM_ADDR;
struct sockaddr_in SENDTO_ADDR;
//struct sockaddr_in LOCALMENTE_addr;
char buf[MAX_BUFFER];
//verifica argumentos
if (argc != 5)
{
printf("USAGE: %s <a.porto> <ip_broadcast> <c.porto> <b.porto>\\n",argv[0]);
exit(1);
}
//cria socket UDP
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0) printf("SOCKET");
length = sizeof(SERVER_ADDR);
bzero(&SERVER_ADDR, length);
SERVER_ADDR.sin_family = AF_INET;
SERVER_ADDR.sin_addr.s_addr = INADDR_ANY;
SERVER_ADDR.sin_port = htons(atoi(argv[1]));
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &V, sizeof(V));
sendlen = sizeof(SENDTO_ADDR);
bzero(&SENDTO_ADDR, sendlen);
SENDTO_ADDR.sin_family = AF_INET;
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[3]));
if(bind(sock, (struct sockaddr *)&SERVER_ADDR,length) < 0) printf("BIND: ");
fromlen = sizeof(struct sockaddr_in);
while(1)
{
printf("Wait for the next message...!\\n");
bzero(&buf, MAX_BUFFER);
n = recvfrom(sock,buf,MAX_BUFFER,0,(struct sockaddr *) &FROM_ADDR, &fromlen);
if (strstr(buf,"Confirma")){
printf("Mensagem recebida: [%s], bytes recebidos: [%d]\\n",buf,n);
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[4]));
n = sendto (sock, buf,MAX_BUFFER,0,(struct sockaddr *) &SENDTO_ADDR, sendlen);
}
else{
printf("Mensagem recebida: [%s], bytes recebidos: [%d]\\n",buf,n);
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[3]));
n = sendto (sock, buf,MAX_BUFFER,0,(struct sockaddr *) &SENDTO_ADDR, sendlen);
SENDTO_ADDR.sin_addr.s_addr = inet_addr(argv[2]);
SENDTO_ADDR.sin_port = htons(atoi(argv[4]));
strcpy(buf," Confirmado interlocutor. ");
n = sendto (sock, buf,MAX_BUFFER,0,(struct sockaddr *) &SENDTO_ADDR, sendlen);
}
}
}]
Gonçalo Costa
Curtidas 0