C sockaddr вызов функции для sendto?

В настоящее время я настраиваю сокет UDP для школьного задания, но не могу понять, как правильно отправить sockaddr в качестве параметра в функцию. Входные аргументы для SendData определяются так же, как и в функции sendto.

void SendData(int fileDescriptor, const struct sockaddr_in *destAddrUdp, unsigned char buffer[MAXMSG])
{
  /* crc */
  int strlength = strlen(buffer);
  unsigned char SCRC = CRC(buffer, strlength-1);
  buffer[strlength-1] = SCRC;
  buffer[strlength] = '\0'; 
  /* send */
  if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) {
    fprintf(stderr, "Could not send data\n");
  }
} `

Когда приведенный ниже код вызывается из main, он работает, однако при вызове из SendData возвращаемое значение из sendto равно -1.

if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) {
    fprintf(stderr, "Could not send data\n");
  }

Если программа скомпилирована, я получаю предупреждение: передача аргумента 5 'recvfrom' из несовместимого типа указателя. на функцию sendto вызывать в SendData. Вызов функции для SendData в моей основной программе: SendData(sockfd, (struct sockaddr *) &destAddrUdp, buffer);

Основная программа на случай, если она актуальна:

unsigned char SCRC;
  unsigned char strlength;
  unsigned char buffer[MAXMSG-5];
  unsigned char header[MAXMSG];
  struct rtp_struct *sendstruct; 
  /* option 2 */
  struct sockaddr_in destAddrUdp;
  int sockfd; 
  char dstHost[15]; 
  printf("input host IP:\n>");
  fgets(dstHost, 15, stdin);

  /* Create socket */ 
  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
    fprintf(stderr, "Can't create UDP socket\n");

  /* set configurations */
  memset (&destAddrUdp, 0, sizeof(destAddrUdp));  //set zero
  destAddrUdp.sin_family = AF_INET; //internet use
  destAddrUdp.sin_addr.s_addr = inet_addr(dstHost); //set so anyone can connect
  destAddrUdp.sin_port = htons(dstUdpPort); //set the port to use

  /* Generate CRC table */
  GenerateCRCTable();

/* get string and send */
while(1) {
    printf("\n>");
    fgets(buffer, MAXMSG, stdin);
    if(strncmp(buffer,"quit\n",MAXMSG) != 0){ //if read string == quit, see else
      strlength = strlen(buffer);
      SCRC = CRC(buffer, strlength-1);
      buffer[strlength-1] = SCRC;
      buffer[strlength] = '\0';

      SendData(sockfd, (struct sockaddr *) &destAddrUdp, buffer);
      /*if (sendto(sockfd, buffer, strlength, 0, (struct sockaddr *) &destAddrUdp,sizeof(destAddrUdp)) < 0){
        fprintf(stderr, "Could not send data\n");}*/
    }  
    else {   
      close(sockfd); 
      exit(EXIT_SUCCESS);
    }
  }
}

2 ответа

В вашем SendData функция, параметр destAddrUdp имеет тип const struct sockaddr_in *, Когда вы делаете этот звонок:

sendto(fileDescriptor, buffer, strlen(buffer), 0, 
       (struct sockaddr*) &destAddrUdp, sizeof(destAddrUdp)

Выражение &destAddrUdp имеет тип const struct sockaddr_in **поэтому тип указателя несовместим. Также, sizeof(destAddrUdp) возвращает размер указателя, а не размер структуры.

Вы не смогли учесть различные типы destAddrUdp в SendData а также main, Правильный вызов sendto было бы:

sendto(fileDescriptor, buffer, strlen(buffer), 0, 
       (struct sockaddr*) destAddrUdp, sizeof(*destAddrUdp)

Проблема заключается в sizeof(destAddrUdp) и (struct sockaddr*) &destAddrUdp,

В твоем основном, destAddrUdp является struct sockaddr_inв вашей функции, однако, его sockaddr_in* поэтому вы не можете использовать их одинаково. Первый, sizeof(destAddrUdp) в вашей функции даст вам размер указателя, второй, &destAddrUdp в вашей функции даст вам destAddrUdp**, Это не то, что вы хотите.

Пытаться sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) destAddrUdp,sizeof(*destAddrUdp))

Другие вопросы по тегам