Raw Socket - Программирование на C
Я пытаюсь использовать необработанные сокеты с C, чтобы отправить сообщение на свой компьютер по петле (lo), но у меня возникли проблемы и я не мог понять причину, поскольку все, похоже, в порядке в соответствии с ссылки, которые я нашел в Интернете.
Вот как я открываю сокет:
int socket_id = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
А вот и моя программа отправки:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/ethernet.h>
#include <linux/if_packet.h>
#include <linux/if.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int socket_id = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
printf("%d\n", socket_id);
struct sockaddr_in sin;
char buffer[16] = "Hello, world!";
int count;
sin.sin_family = AF_PACKET;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
for(count = 1; count <=20; count++) {
if(sendto(socket_id, buffer, strlen(buffer), 0, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
perror("sendto() error");
exit(-1);
}
else {
printf("Count #%d - sendto() is OK.\n", count);
sleep(2);
}
}
return 0;
}
Я использую необработанные сокеты, потому что в конце я отправлю протоколы Kermit, а пока я просто пытаюсь отправить простой массив символов. Я всегда запускаю программу с помощью sudo (используя Linux), а оператор if всегда возвращает true и завершает программу.
Есть идеи, почему это происходит?