I’m learning how to work with raw sockets in Linux. I’m trying to create a socket like that:
if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
perror("socket() failed");
exit(-1);
}
But all I got after launch is:
socket() failed: Operation not permitted
I know that only root can create raw sockets, but if I run it with SUID bit or sudo – the
problem is the same. What’s wrong? The system is Ubuntu 11.04.
Maybe I’m including needless headers?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
And I’m wondering – why SUID is useless?
My money on you not running your code correctly.
I’ve copied and pasted your exact code into an empty
main(). I get the same error if I run it as myself, but it runs correctly undersudo. This is on Ubuntu.The code:
Run as myself:
Run as root: