int main(int argc, char* argv) { SOCKET s; struct protoent *pp; int rc; char icmpdg[1024]; pp = getprotobyname("icmp"); if (pp == NULL){ printf("getprotobyname failed, errno %d.\n", errno); exit(errno); } s = socket(AF_INET, SOCK_RAW, pp->p_proto); if (!IS_VALID_SOCK(s)){ printf("socket RAW failed, errno %d.\n", errno); exit(errno); } for(;;) { rc = recvfrom(s, icmpdg, sizeof(icmpdg), 0, NULL, NULL); if (rc < 0){ printf("recvfrom failed, errno %d.\n", errno); exit(errno); } //printf("(%d bytes)%s\n", rc, icmpdg); print_dg(icmpdg, rc); } return 0; }
inline SOCKET mksock() { /*Initialize RAW socket UDP level*/ SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); /*setup some more settings for polling*/ if(!IS_VALID_SOCK(sock)) error(1, 0, "Error socket initialization"); if(SetNonBlock(sock) < 0) error(1, errno, "Error switching socket to non-block mode."); if(SetReusable(sock) < 0) error(1, errno, "Error making socket reusable"); return sock; }