用raw socket截获所有端口socket数据包!有这方面经验帮我看看吧,多谢了
mtsw 2004-11-09 05:29:09 我的源程序如下:
compile通过,但是收不到数据包,一直停在recv调用处。OS:solaris.多谢了。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/filio.h>
#include <arpa/inet.h>
#include <time.h>
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef struct _TCP{
WORD SrcPort;
WORD DstPort;
DWORD SeqNum;
DWORD AckNum;
BYTE DataOff;
BYTE Flags;
WORD Window;
WORD Chksum;
WORD UrgPtr;
} TCP;
TCP tcp;
typedef TCP *LPTCP;
typedef TCP *ULPTCP;
//typedef TCP UNALIGNED *ULPTCP;
typedef struct _IP {
union {
BYTE Version;
BYTE HdrLen;
};
BYTE ServiceType;
WORD TotalLen;
WORD ID;
union{
WORD Flags;
WORD FragOff;
};
BYTE TimeToLive;
BYTE Protocol;
WORD HdrChksum;
DWORD SrcAddr;
DWORD DstAddr;
BYTE Options;
} IP;
typedef IP *LPIP;
typedef IP *ULPIP;
IP ip;
//typedef IP UNALIGNED *ULPIP;
#define BUFFER_SIZE 200 ;
int sock ;
struct sockaddr_in addr_in;
char LocalName[100];
struct hostent *pHost;
char RecvBuf[10000];
bool flag;
main(){
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
flag = true;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
gethostname((char*)LocalName,100);
pHost = gethostbyname((char*)LocalName);
addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0];
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);
bind(sock, (struct sockaddr*)&addr_in, sizeof(addr_in));
DWORD dwValue = 1;
//ioctlsocket(sock, SIO_RCVALL, &dwValue);
//ioctl(sock, FIOGETOWN, &dwValue);
ioctl(sock, SIOCGLIFINDEX, &dwValue);
printf("Hostname:%s.\nStarting Receive Socket Data.\n",LocalName);
memset(RecvBuf,sizeof(RecvBuf),0);
while (true)
{
int ret = recv(sock, RecvBuf, 1024,0);
if (ret > 0)
{
ip = *((IP*)RecvBuf);
tcp = *(TCP*)(RecvBuf + ip.HdrLen);
printf("protocol:%s\n",ip.Protocol);
printf("srcIP:%s\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));
printf("dstIP:%s\n",inet_ntoa(*(in_addr*)&ip.DstAddr));
printf("srcport:%d\n",tcp.SrcPort);
printf("dstport:%d\n",tcp.DstPort);
printf("totalLen:%d\n",ntohs(ip.TotalLen));
}
}
close(sock);
}