为什么32位和64位的输出不一样

cnhawk386 2009-03-19 07:48:47
想计算下1秒内有多少发往本机80端口的syn包,分别在32位系统上和64位系统上编译执行,为什么64位的printf打印出来的和return的不一样.
输出为结尾syn_count的值,
./a.out
echo $?
发现两个结果在64位上不一样,为什么.

[Copy to clipboard] [ - ]
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <string.h>
#include <netdb.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/if_ether.h>
#include <net/ethernet.h>
#include <sys/time.h>

void die(char *why, int n)
{
perror(why);
exit(n);
}

int do_promisc(char *nif, int sock )
{
struct ifreq ifr;
strncpy(ifr.ifr_name, nif,strlen(nif)+1);
if ((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) //获得flag
{
die("ioctl", 2);
}
ifr.ifr_flags |= IFF_PROMISC; //重置flag标志
if (ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 ) //改变模式
{
die("ioctl", 3);
}
}
//修改网卡成PROMISC(混杂)模式

char buf[40960]={0};

int main()
{
struct sockaddr_in addr;
struct ether_header *peth;
struct iphdr *pip;
struct tcphdr *ptcp;
struct udphdr *pudp;

char mac[16];
int i,sock, r, len;
char *data;
char *ptemp;
char ss[32],dd[32];

int syn_count=0;
//timer
struct timeval tv;
struct timezone tz;
int t_start;


if ((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) //建立socket//man socket可以看到上面几个宏的意思以看
{
die("socket", 1);
}

do_promisc("eth0", sock); //eth0为网卡名

//开始时间
gettimeofday (&tv , &tz);
t_start=tv.tv_sec;

for (;;)
{
len = sizeof(addr);

r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,(socklen_t *)&len);
//调试的时候可以增加一个输出r的语句判断是否抓到包
if(r <=0)
{
continue;
}
buf[r] = 0;
ptemp = buf;
peth = (struct ether_header *)ptemp;
ptemp += sizeof(struct ether_header); //指针后移eth头的长度
pip = (struct iphdr *)ptemp; //pip指向ip层的包头
ptemp += sizeof(struct ip);//指针后移ip头的长度
switch (pip->protocol) //根据不同协议判断指针类型
{
case IPPROTO_TCP:
ptcp = (struct tcphdr *)ptemp; //ptcp指向tcp头部
if((ntohs(ptcp->source)!=80)&&(ntohs(ptcp->dest)== 80)&&(ptcp->syn==1)){
syn_count++;
}
break;
default:
break;
} //end switch

gettimeofday (&tv , &tz);
if(tv.tv_sec>=t_start+1){
printf("count=%d\n",syn_count);
return syn_count;
}

}
return 0;
}
...全文
149 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
printf("count=%d\n",syn_count);
return syn_count;
}
打印的跟return不一样?你怎么知道return syn_count; 的结果?哪里有调用?
otmac 2009-03-19
  • 打赏
  • 举报
回复
这个在Linux专区去问效果好些。
Rain208 2009-03-19
  • 打赏
  • 举报
回复
帮顶

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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