网络数据抓包 socket编程

GG_wang 2013-04-18 09:44:46
为什么到recv处就停止了呢 ???

代码:

#include "sockheader.h"
#include <string.h>

//#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_MAX 23*1024

bool flag=true;
int main()
{
WSADATA data;
DWORD dwValue=0;
WSAStartup( MAKEWORD( 2,2 ), &data );
SOCKET sock,sock1 ;
PIP_HEADER ip =(PIP_HEADER)malloc(sizeof(IP_HEADER));
PTCP_HEADER tcp = (PTCP_HEADER)malloc(sizeof(TCP_HEADER));
char name[128];
char RecvBuf[BUFFER_MAX];

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

if(SOCKET_ERROR==sock)
{
printf("create socket error\n");
//exit(0);
}
gethostname(name,strlen(name));
printf("%s\n",name);
struct hostent *pHostent;
struct sockaddr_in myaddr;
memset((void *)&myaddr,0,sizeof(myaddr));
pHostent = gethostbyname(name);
myaddr.sin_addr = *(struct in_addr*)pHostent->h_addr_list[0];
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(6656);
if(SOCKET_ERROR==setsockopt(sock,IPPROTO_IP,SO_REUSEADDR,(char*)&flag,sizeof(flag)))printf("1 %d\n",WSAGetLastError());//设置ip头操作选项
if(SOCKET_ERROR==bind(sock,(struct sockaddr *)&myaddr,sizeof(myaddr)))printf("2 %d\n",WSAGetLastError());
if(ioctlsocket(sock,FIONBIO,&dwValue)==SOCKET_ERROR)printf("3 %d\n",WSAGetLastError());//设置混杂模式
//

while (1)
{
if(SOCKET_ERROR==connect(sock,(struct sockaddr *)&myaddr,sizeof(myaddr))) printf("4 %d\n",WSAGetLastError());
int ret = recv(sock, RecvBuf, BUFFER_MAX, 0);//接受原始数据包信息
printf("5 %d\n",WSAGetLastError());
if (ret>0)
{
printf("ok\n");
ip = (PIP_HEADER)RecvBuf;
if(ip->ProtocolType == 6) tcp = (PTCP_HEADER)(RecvBuf+ip->TotalLength);//是否使用的是TCP协议
printf("协议:%s\r\n",GetProtocol(ip->ProtocolType));
printf("IP源地址:%s\r\n",inet_ntoa(*(struct in_addr*)&ip->SourceIP));
printf("IP源地址:%s\r\n",inet_ntoa(*(struct in_addr*)&ip->DestIP));
printf("TCP源端口号:%d\r\n",tcp->SourcePort);
printf("TCP目的端口号:%d\r\n",tcp->DestPort);
printf("数据包长度:%d\r\n",ntohs(ip->TotalLength));
}
}
WSACleanup();//解除与Socket库的绑定并且释放Socket库所占用的系统资源
system("pause");
}

char *GetProtocol (int protocol)
{
switch(protocol)
{
case IPPROTO_TCP:
return PROTOCOL_STRING_TCP_TXT;
case IPPROTO_UDP:
return PROTOCOL_STRING_UDP_TXT;
case IPPROTO_ICMP:
return PROTOCOL_STRING_ICMP_TXT;
default:
return PROTOCOL_STRING_UNKNOW_TXT;
}
}


头文件:

#include <iostream>
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")

using namespace std;

#define PROTOCOL_STRING_ICMP_TXT "ICMP"
#define PROTOCOL_STRING_TCP_TXT "TCP"
#define PROTOCOL_STRING_UDP_TXT "UDP"
#define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW"


typedef struct _IP_HEADER {
unsigned char VersionAndLenth;//版本信息(前四位)和头长度(后四位)
unsigned char TypeofService;//服务类型
unsigned short TotalLength;//数据包长度
unsigned short Identifier;//数据包标识
unsigned short Reserved;//保留字段
unsigned char TTL;//生成时间
unsigned char ProtocolType;//协议类型
unsigned short CheckSum;//校验和
unsigned int SourceIP;//源IP
unsigned int DestIP;//目的IP
}IP_HEADER,*PIP_HEADER;

typedef struct _TCP_HEADER {
unsigned short SourcePort;//源端口号
unsigned short DestPort;//目的端口号
unsigned int Sequence;//序列号
unsigned int AcknowledgeNum;//确认号
unsigned char LengthAndReserve;//前4位:TCP头长度,中6位:保留,后6位:标志位
unsigned char Flags;//
unsigned short Window;//窗口大小
unsigned short CheckSum;//校验和
unsigned short UrgentPointer;//紧急数据偏移量
}TCP_HEADER,*PTCP_HEADER;

typedef struct _UDP_HEADER {
unsigned short SourcePort;//源端口号
unsigned short DestPort;//目的端口号
unsigned short Length;//数据包长度
unsigned short CheckSum;//校验和
} UDP_HEADER ,*PUDP_HEADER;

typedef struct _ICMP_HEADER {
unsigned char ICMPType;//类型
unsigned char Code;//代码
unsigned short CheckSum;//检验和
}ICMP_HEADER;

char *GetProtocol (int);
...全文
161 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
youyou1912 2013-04-19
  • 打赏
  • 举报
回复
你是不是第二个参数用错了 socket(AF_INET, SOCK_RAW, IPPROTO_IP)
buyong 2013-04-19
  • 打赏
  • 举报
回复
recv如果没接到数据,就是一直等
tommwq 2013-04-19
  • 打赏
  • 举报
回复
SOCK_STREAM的socket能抓到包吗?
GG_wang 2013-04-18
  • 打赏
  • 举报
回复
谁明白啊。。。。这个问题真的很纠结啊
GG_wang 2013-04-18
  • 打赏
  • 举报
回复
在线等

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧