Отправить подтверждающее сообщение от pc2 на pc1 одноадресной - PullRequest
0 голосов
/ 31 мая 2019

Доброе утро, у меня есть этот код, в котором задача состоит в том, чтобы отправить сообщение с 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);
    }

    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...