Не удалось отправить сообщение

Я пытаюсь транслировать данные, но вывод не выполнен. Я выбрал случайный порт 33333. Что не так с моим кодом?

int main()
{
   struct sockaddr_in udpaddr = { sin_family : AF_INET };
   int xudpsock_fd,sock,len = 0,ret = 0,optVal = 0;

   char buffer[255];
   char szSocket[64];
   memset(buffer,0x00,sizeof(buffer));
   memset(&udpaddr,0,sizeof(udpaddr));

       udpaddr.sin_addr.s_addr = INADDR_BROADCAST;
       udpaddr.sin_port = htons(33333);

   xudpsock_fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);

   optVal = 1;
   ret = setsockopt(xudpsock_fd,SOL_SOCKET,SO_BROADCAST,(char*)&optVal,sizeof(optVal));
   strcpy(buffer,"this is a test msg");

   len = sizeof(buffer);
   ret = sendto(xudpsock_fd,buffer,len,0,(struct sockaddr*)&udpaddr,sizeof(udpaddr));

       if (ret == -1)
          printf("udp send failed\n");
       else
          printf("udp send succeed\n");

   return (0);
}

2 ответа

Одна из проблем заключается в том, что семейство адресов, которое вы пытаетесь отправить, равно нулю (AF_UNSPEC). Хотя вы инициализируете семью AF_INET в верхней части функции, вы позже обнулите его memset,

В системе, с которой я тестировал, send на самом деле все равно работает по какой-то странной причине, несмотря на недопустимое семейство адресов, но вы должны обязательно попытаться исправить это в первую очередь.

Вероятно, у вас была проблема с маршрутом по умолчанию (например, у вас его не было). sendto необходимо выбрать интерфейс для отправки пакета, но адрес назначения, вероятно, находился за пределами назначения /Genmask для каждого определенного интерфейса (см. инструмент командной строки "route").

Маршрут по умолчанию перехватывает этот тип пакета и отправляет его через интерфейс, несмотря на это несоответствие.

Установка пункта назначения 127.255.255.255 обычно приводит к отправке пакета через интерфейс обратной связи (127.0.0.1), что означает, что он сможет считываться приложениями, которые (в этом случае) выполняются на локальной машине.

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