3,882
社区成员
发帖
与我相关
我的任务
分享#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);