Доброе утро, у меня есть этот код, в котором задача состоит в том, чтобы отправить сообщение с pc1 на pc3 с собеседником посередине (pc2).Когда pc2 получает сообщение от pc1, он отправляет сообщение о приеме на компьютер.Когда pc3 получает сообщение, он отправляет для pc2 подтверждение, которое, в свою очередь, отправляет на pc1.Отправка сообщения с pc2 на pc3 осуществляется через широковещательную рассылку.Все остальное - одноадресная, однако в своем коде я отправил подтверждение с pc2 на pc1 также по трансляции.Может ли кто-нибудь помочь мне изменить код?Спасибо.
код pc2:
#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);
}
}
}