当前位置:  技术问答>linux和unix

一个进程中运行多个ping,接收出错

    来源: 互联网  发布时间:2017-01-16

    本文导语:  我在事件链表中定时去向一个目的地址发送ICMP报文,同时在读链表中添加读事件,(其实就是一个ping程序),这时没有错误,但是当我同时运行2个或两个以上的ping程序时,偶尔会出现这样的情况:A地址根本就是断...

我在事件链表中定时去向一个目的地址发送ICMP报文,同时在读链表中添加读事件,(其实就是一个ping程序),这时没有错误,但是当我同时运行2个或两个以上的ping程序时,偶尔会出现这样的情况:A地址根本就是断开的,但B地址可以平通,结果显示A也能收到包。请各位高手指点。

代码如下:


#include 
#include "prefix.h"
#include "table.h"
#include "rib.h"
#include 
#include 
#include "zebra_vty.h"
#include "memory.h"
#include "debug.h"
#include "rt.h"

#define PACKET_SIZE     1024
#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000)
#define IN_CLASSE(a)            ((((long int) (a)) & 0xf0000000) == 0xf0000000)

pid_t prid;

extern struct thread_master *master;
struct list *static_route_monitor = NULL;

unsigned short cal_chksum(unsigned short *addr,int len);
void send_packet(int fd);
int recv_packet(void);
int unpack(char *buf,int len);


/*校验和算法*/
unsigned short cal_chksum(unsigned short *addr,int len)
{      
int nleft=len;
int sum=0;
unsigned short *w=addr;
unsigned short answer=0;

/*把ICMP报头二进制数据以2字节为单位累加起来*/
while(nleft>1)
{       
sum+=*w++;
nleft-=2;
}
/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/
if( nleft==1)
{       
*(unsigned char *)(&answer)=*(unsigned char *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return answer;
}
/*设置ICMP报头*/
int pack(int pack_no, char *sendpacket)
{      
int packsize;
struct icmphdr *icmp;
icmp=(struct icmphdr*)sendpacket;
icmp->type=ICMP_ECHO;
icmp->code=0;
icmp->checksum=0;
icmp->un.echo.sequence=pack_no;
icmp->un.echo.id=prid;
packsize=8+40;
icmp->checksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/

return packsize;
}

/*剥去ICMP报头*/
int unpack(char *buf,int len)
{
int iphdrlen;
struct iphdr *ip;
struct icmphdr *icmp;

ip=(struct iphdr *)buf;
iphdrlen=ip->ihlthread_rec = thread_add_read(master, recv_monitor_packet, sroute, sroute->sockfd);
}
else
{
close(sroute->sockfd);
sroute->sockfd = 0;
THREAD_OFF(sroute->thread_timeout);

zebra_route_update(sroute, 1);
}
return 0;
}

int send_monitor_packet_timeout(struct thread *t)
{
struct zebra_route_monitor_st *sroute;

sroute = THREAD_ARG(t);
sroute->thread_timeout = NULL;

close(sroute->sockfd);
THREAD_OFF(sroute->thread_rec);

zebra_route_update(sroute, 2);
return 0;
}

int send_monitor_packet(struct thread *t)     //开始发送报文
{
int sendfd = -1;
struct zebra_route_monitor_st *sroute;
struct in_addr nexthop_IP;
struct in_addr monitor_addr;

sroute = THREAD_ARG (t);
inet_aton(sroute->route.gate_str,&nexthop_IP);
sroute->thread_send = thread_add_timer(master,send_monitor_packet,sroute,sroute->route.m_interval); //定时发送报文


inet_aton(sroute->route.monitor_addr,&monitor_addr);
sendfd = do_detect(sroute->bind_ifname,monitor_addr,sroute->route.packet_count);
if(sendfd sockfd = sendfd;
if(sroute->thread_rec)
THREAD_OFF(sroute->thread_rec);
sroute->thread_rec = thread_add_read(master, recv_monitor_packet, sroute, sendfd);   //读取报文看看是否ping通了
if(sroute->thread_timeout)
THREAD_OFF(sroute->thread_timeout);
sroute->thread_timeout = thread_add_timer(master,send_monitor_packet_timeout,sroute, sroute->route.timeout);
return 0;
}


int zebra_route_test(struct zebra_route_monitor_st *data)
{
struct zebra_route_monitor_st *sroute;
struct zebra_route_monitor_st *monitor = NULL;
...........
         ...........

monitor = XMALLOC(MTYPE_ROUTE_MONITOR, sizeof(struct zebra_route_monitor_st));
if(!monitor)
return 4;
memset(monitor, 0, sizeof(struct zebra_route_monitor_st));
memcpy(monitor, sroute, sizeof(struct zebra_route_monitor_st));
if(monitor->route.m_interval route.m_interval = ROUTE_TEST_LOOPTIME;
if(monitor->route.timeout route.timeout > monitor->route.m_interval)
monitor->route.timeout = ROUTE_TEST_TIMEOUT;
//if(monitor->route.monitor_IP.s_addr == 0)
//inet_aton(monitor->route.gate_str, &(monitor->route.monitor_IP));
listnode_add(static_route_monitor, monitor);       //这个static_route_monitor是一个ping链表,我向其中
                                                             //加ping程序,当我只是做一个定期ping时没问题,但
                                                              //添加多个定时ping就偶尔会出问题
monitor->thread_send =thread_add_timer(master, send_monitor_packet, monitor, 1);  //开始定时发包,
                                                                                            //ping程序开始运行

return 0;
}



|
你在recv_monitor_packet 里面多检查一下来源ip不就可以了么

|
原始套接字是整个系统的,所以发往本机的包将会产生N份副本送往N个原始套接字.

|


你直接看网络编程原始套接字章节第一页就知道为什么了.

    
 
 

您可能感兴趣的文章:

  • 急!子进程在运行,结束父进程会出错,怎么解决?
  • Ubuntu查看内存,进程相关命令介绍 iis7站长之家
  • 启动gnome守护进程出错
  • 进程复制数据到系统的内核地址出错,这时会出现什么问题?
  • 请教:写守护进程函数时出错!
  • 用无名管道实现进程通信,可是出错了,打击哦
  • socket发送端、接收端同一机器,kill掉接收端进程,发送端也被kill?
  • 发出SIGUSR1命令后,接收进程怎样定义接收后的动作
  • 关于多进程同时接收终端输入的问题
  • 如何确定信号的来源?即如何知道接收到的信号来自于哪一个进程号?
  • 守护进程接收信号杀死或重启子进程 如何实现?
  • linux下进程接收不到SIGPIPE信号!!
  • 请问:signal(), sigaction()函数会不会使自已所有的进程挂起啊,(这样就等接收各种信号,进行一些处理工作啊)
  • 谁能帮几个qmail问题?1、qmail-remote进程?2、怎么控制整个服务器用户的收信设置?3、怎么直接删除某规则的邮件而接收?
  • 进程间通信:消息队列问题:进程1接收不到进程2的消息
  • 多进程接收socket数据的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 怎么启动一个进程会在进程列表中显示出多个同名进程?
  • 请教如何编程实现父进程产生多个子进程
  • 一个进程中的多个线程不会被调度到一台机器中的多个cup并行执行吗?
  • 多个进程共用一个信号量,如果某个进程死掉,此时又将信号量锁定,其它进程就死掉,有什么办法可以解决这一问题
  • 多个同名进程的问题--急解决
  • 请教POSIX问题:一个进程中,可以有多个互斥锁麽?
  • 诸如httpd那样的服务,一次开多个进程,每个进程都监听同一个端口,但是一个端口怎么绑定多次呢?
  • 请问大虾们,同一串口能否被多个进程同时操作?
  • spawn-fcgi是如何做到让多个fastcgi进程监听同一端口的?
  • 怎么让多个进程共用一个socket
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • 如果有多个telnet登录,会不会有相同的进程号?
  • 问一个shell问题?怎样杀死多个进程。
  • 提问:如何控制多个进程?
  • 如何在多个进程之间共享一个磁盘文件?
  • 多个进程同时写一个管道会不会有问题???
  • 一个进程分离出多个线程后cpu时间分配问题
  • 如何在一个程序中同时启动多个进程执行不同的命令?
  • 如果父进程有多个线程,那么它的子进程也该拥有这些线程
  • 当多个进程同时进行打印输出时的问题
  • linux僵尸(zombie)进程介绍及清除
  • 进程Afork进程B,进程Bfor进程C,如果进程C退出发出SIGCHLD,A进程是否可以收到
  • Ubuntu查看内存,进程相关命令介绍
  • 如果一个server进程要fork许多子进程,但不等待子进程终止,也不希望子进程结束后处于僵进程状态直到父进程终止。请问可采用什么方法实现
  • linux下进程占用内存空间详解
  • 在多进程中父进程frok子进程,怎样让子进程自举,脱离父进程,而且父进程不退出
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • fock()开出的子进程的进程ID是否进程ID都大于父进程的?
  • android 4.0 托管进程介绍及优先级和回收机制
  • 父进程等待子进程n秒,如果子进程正常退出,父进程立即继续向下执行,如果子出现进程故障一直不退出,父进程等待n秒后继续向下执行,请问
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3