用原始套接字监听局域网内的数据包,为什么只能得到ip头内的源IP地址而目的IP地址总是会等于源IP地址??

kxyes 2003-09-26 03:11:53
奇怪了为什么就是不能得到目的IP地址??


#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <Mstcpip.h>
#pragma comment(lib,"Ws2_32")
#define MAX_PACK_LEN 1024
typedef struct ip_hdr //定义IP首部
{
unsigned char h_lenver; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short th_flag; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char iProtocol; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;

void DeCodeIP(char *buf,int iBufSize) //解析侦听到的IP数据包

{

IP_HEADER * pIPhdr;

pIPhdr=(IP_HEADER * )buf;

sockaddr_in dest,src;

dest.sin_family=AF_INET;
dest.sin_addr.S_un.S_addr=pIPhdr->destIP;
src.sin_family=AF_INET;
src.sin_addr.S_un.S_addr=pIPhdr->sourceIP;
char *lpdest=inet_ntoa(dest.sin_addr);
char *lpsrc=inet_ntoa(src.sin_addr);
printf("dest:%s,src:%s\n",lpdest,lpsrc);

}
int main(int argc, char* argv[])
{
int iErrorCode;

char RecvBuf[MAX_PACK_LEN];

WSADATA wsaData;

iErrorCode = WSAStartup(MAKEWORD(2,2),&wsaData);

SOCKET SockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);

SOCKADDR_IN sa;

sa.sin_family = AF_INET;

sa.sin_port = htons(6000);

sa.sin_addr.S_un.S_addr=inet_addr("192.168.0.1");



if(bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa))!=0)
{
printf("bind error!");
WSACleanup();
}


DWORD dwBufferLen[10] ;

DWORD dwBufferInLen=1;

DWORD dwBytesReturned=0;

iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),

NULL, 0,&dwBytesReturned , NULL , NULL );
if(iErrorCode==SOCKET_ERROR)
{
printf("ioctl error!");
WSACleanup();
}


while(1)

{

memset(RecvBuf, 0, sizeof(RecvBuf));
iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf),0);
if(iErrorCode!=SOCKET_ERROR&&iErrorCode>20)
DeCodeIP(RecvBuf, iErrorCode);

}

return 0;
}
...全文
145 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxyes 2003-09-26
  • 打赏
  • 举报
回复
这样还是一样不能得到目的IP地址啊??
仍然和源IP地址一样~!!
tide2355 2003-09-26
  • 打赏
  • 举报
回复
ps
注意释放内存
delete lpsrc;
delete lpdest;
tide2355 2003-09-26
  • 打赏
  • 举报
回复
看到inet_ntoa()函数没?
查查 msdn 。这个函数返回的是一个静态的数据缓冲,所以你这样用
char *lpdest=inet_ntoa(dest.sin_addr);
char *lpsrc=inet_ntoa(src.sin_addr);
printf("dest:%s,src:%s\n",lpdest,lpsrc);
是错误的。
必须自己申请2块char的缓冲,把inet_ntoa返回的缓冲里面的数据拷贝进去。
char *lpdest = new char[15];
strcpy(lpdest,inet_ntoa(dest.sin_addr));
char *lpsrc = new char[15];
strcpy(lpsrc,inet_ntoa(dest.sin_addr));
printf("dest:%s,src:%s\n",lpdest,lpsrc);

下载链接为: https://pan.quark.cn/s/1bfadf00ae14 松下电工数字压力传感器用户手册详细介绍了DP-100系列数字压力传感器,涵盖其技术参数、操作方法及适用场景等,适用于各类需要精准压力测量的工业环境。 双屏显示:主屏与输出动作同步,可同时显示当前值和基准值,便于实时监控与调整。显示屏为12段字母数字显示,数字清晰易读。 三色指示:屏幕颜色随传感器状态变化(红、绿、橙),便于快速判断工作状态。 紧凑结构:尺寸仅□30mm,适合空间狭窄的安装环境。 多种操作模式:提供RUN模式(日常操作)、菜单设定模式(深入设置如输出模式切换)及PRO模式(高级功能如应差调整、复制设定)。 安全认证:DP-101(A)/102(A)型号通过特定认证,确保产品安全可靠。 复制功能:可通过数据通信将主传感器设定内容复制到其他传感器,减少人工设定错误,节省时间。 高性能传感:具备高精度,分辨率1/2,000,反应时间2.5ms(最长5,000ms可调),温度特性±0.5%F.S.,重复精度±0.1%F.S. 电子元件吸附检测:监测吸盘是否成功吸附电子元件。 总压力监测:测量管道或容器内的压力水平。 空气泄漏检测:通过压力变化检测泄漏情况。 DP-101□:适用于低压环境(-100kPa至100kPa)。 DP-102□:适用于高压环境(0kPa至1MPa)。 订购时需根据实际需求选择合适型号,考虑传感器的适用范围和工作条件。手册提供详细订购流程及注意事项,包括相关认证信息(如韩国S标志)。 复制功能:通过数据通信将主传感器设定复制到其他传感器,支持多种设定模式,避免设定错误,节省时间。 操作模式:RUN模式用于日常监控,菜单设定模式用于深入设置,PRO模式提供高级功能。 使用前需仔细阅读手册,了解各功能使用方法。遵循安全指南,正确安装和使用传感器,避免损坏。对于

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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