Сырье сокет отправлять и получать - PullRequest
0 голосов
/ 16 декабря 2018

Просто для изучения необработанных сокетов в CI я пишу простой сервер, который использует необработанные сокеты для получения и отправки сообщений.

Я создаю сокет

if ((r_sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP))< 0){
   perror("socket");
   exit(-1);
}

Затем я создаю бесконечный цикл и начинаю получать, обрабатывать и отвечать

while(1){
   if((n = recvfrom(r_sock, buffer, BUFLEN, 0, (struct sockaddr *) &client, &client_len))<0){
      perror("recvfrom");
      exit(-1);
   } 

   // Discard messages not intended to the server
   if(htons(udp->uh_dport) != my_port){
      continue;
   }

   //Do whatever with the data received and then send reply to client
   // ....

   if((n = sendto(r_sock, udp, ntohs(udp->uh_len), 0, (struct sockaddr *) &client, client_len))<0){
      perror("sendto");
      exit(-1);
   } 
}

Я не показываю здесь определениекаждая переменная, но ради полноты, буфер - это массив символов размера BUFLEN (достаточно большой), а udp - это указатель struct udphdr на правильную позицию в буфере.

Дело в том, что у меня есть другойпрограмма, которая служит клиентом, используя стандартные сокеты UDP (SOCK_DGRAM), которая, как доказано, работает должным образом (я также попробовал с netcat на всякий случай).Когда я отправляю сообщение клиенту, он никогда не получает ответ.Кажется, что когда сервер отправляет ответ клиенту, сам сервер получает сообщение, а клиент ничего не получает.

Итак, мой вопрос: есть ли способ решить эту проблему с помощью необработанных сокетов?То есть, чтобы сервер не получал свои собственные сообщения и не позволял другим получать их?

Заранее спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Я только что понял, что это была проблема с контрольной суммой ... Как только у меня была правильная контрольная сумма в UDP, пакет был правильно получен клиентом.

Wireshark дал мне руководство к решению.Я увидел, что контрольная сумма не была проверена, поэтому я выбрал «Правка»> «Настройки»> «Протоколы»> «UDP»> «Проверить контрольную сумму UDP», если это возможно, и проверил ее.

Надеюсь, это поможет

...