1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <cstdio> #include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h> #include <errno.h> char rbuf[500]; typedef struct _IP_HEADER { char m_cVersionAndHeaderLen; char m_cTypeOfService; short m_sTotalLenOfPacket; short m_sPacketID; short m_sSliceinfo; char m_cTTL; char m_cTypeOfProtocol; short m_sCheckSum; unsigned int m_uiSourIp; unsigned int m_uiDestIp; }IP_HEADER, * PIP_HEADER; typedef struct _UDP_HEADER { unsigned short m_usSourPort; unsigned short m_usDestPort; unsigned short m_usLength; unsigned short m_usCheckSum; }UDP_HEADER, * PUDP_HEADER; int main() { int sockfd, size, ret; char on = 1; struct sockaddr_in saddr; struct sockaddr_in raddr; IP_HEADER iph; UDP_HEADER udph; size = sizeof(struct sockaddr_in); memset(&saddr, 0, size); saddr.sin_family = AF_INET; saddr.sin_port = htons(8888); saddr.sin_addr.s_addr = inet_addr("192.168.0.153"); sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sockfd < 0) { perror("socket failed"); return -1; }; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); ret = bind(sockfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr)); if (ret < 0) { perror("bind failed"); getchar(); return -1; }; int val = sizeof(struct sockaddr); while (1) { puts("waiting data"); ret = recvfrom(sockfd, rbuf, 500, 0, (struct sockaddr*)&raddr, (socklen_t*)&val); if (ret < 0) { printf("recvfrom failed:%d", errno); return -1; }; memcpy(&iph, rbuf, 20); memcpy(&udph, rbuf + 20, 8); int srcp = ntohs(udph.m_usSourPort); struct in_addr ias, iad; ias.s_addr = iph.m_uiSourIp; iad.s_addr = iph.m_uiDestIp; char strDip[50] = ""; strcpy(strDip, inet_ntoa(iad)); printf("(sIp=%s,sPort=%d), \n(dIp=%s,dPort=%d)\n", inet_ntoa(ias), ntohs(udph.m_usSourPort), strDip, ntohs(udph.m_usDestPort)); printf("recv data :%s\n", rbuf + 28); }; close(sockfd); return 0; };
|