Просто для изучения необработанных сокетов в 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 на всякий случай).Когда я отправляю сообщение клиенту, он никогда не получает ответ.Кажется, что когда сервер отправляет ответ клиенту, сам сервер получает сообщение, а клиент ничего не получает.
Итак, мой вопрос: есть ли способ решить эту проблему с помощью необработанных сокетов?То есть, чтобы сервер не получал свои собственные сообщения и не позволял другим получать их?
Заранее спасибо!