如何实现在C语言环境下编写ping程序 (如何实现在c51中调用汇编程序)

教程大全 2025-07-19 10:46:49 浏览
在clinux中实现 ping命令 ,可以使用命令来测试网络连通性。

在Linux上实现ping命令

网络诊断工具详解与实践

1、引言

ICMP协议 理解

ping命令简介

2、ICMP包封装和解封

ICMP协议理解

ICMP包组装

ICMP包校验

3、原始套接字编程

创建套接字

设置套接字选项

发送ICMP请求报文

接收ICMP回复报文

4、PING流程

创建线程用于ICMP包的发送

创建线程用于ICMP包的接收

5、常见问题与解答

Q1: 如何在CentOS中长时间ping一个IP?

Q2: 如何更改ping命令的数据包大小?

6、归纳与展望

归纳

展望

以上就是关于“ clinux实现ping ”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!


cmd代码大全

ping -t -l ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。 例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。 同时使用参数/Q 可取消删除操作时的系统确认就直接删除。 (二个命令作用相同)move 盘符路径要移动的文件名 存放移动文件的路径移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖fc > 对比二个文件并把不同之处输出到文件中,> 和> > 是重定向命令at id号 开启已注册的某个计划任务at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止at id号 /delete 停止某个已注册的计划任务at 查看所有的计划任务at ip time 程序名(或一个命令) /r 在某时间运行对方某程序并重新启动计算机finger username @host 查看最近有哪些用户登陆telnet ip 端口 远和登陆服务器,默认端口为23open ip 连接到IP(属telnet登陆后的命令)telnet 在本机上直接键入telnet 将进入本机的telnetcopy 路径文件名1 路径文件名2 /y 复制文件1到指定的目录为文件2,用参数/y就同时取消确认你要改写一份现存目录文件copy ipadmin$ 复制本到对方的admin下copy /b+/a 将的内容藏身到中生成新的文件,注文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件copy ipadmin$ c: 或:copyipadmin$*.* 复制对方admini$共享下的文件(所有文件)至本地C:xcopy 要复制的文件或目录树 目标地址目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件用参数/e才可连目录下的子目录一起复制到目标地址下。 tftp -i 自己IP(用肉机作跳板时这用肉机IP) get 登陆后,将“IP”的下载到目标主机 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送tftp -i 对方IP put 登陆后,上传本至主机ftp ip 端口 用于上传文件至服务器或进行文件操作,默认端口为21。 bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时)route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interfacearp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。 arp -a将显示出全部信息start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令mem 查看cpu使用情况attrib 文件名(目录名) 查看某文件(目录)的属性attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间set 指定环境变量名称=要指派给变量的字符 设置环境变量set 显示当前所有的环境变量set p(或其它字符) 显示出当前以字符p(或其它字符)开头的所有环境变量pause 暂停批处理程序,并显示出:请按任意键继续 在批处理程序中执行条件处理(更多说明见if命令及变量)goto 标签 将导向到批处理程序中带标签的行(标签必须单独一行,且以冒号打头,例如:“:start”标签)call 路径批处理文件名 从批处理程序中调用另一个批处理程序 (更多说明见call /?)for 对一组文件中的每一个文件执行某个特定命令(更多说明见for命令及变量)echo on或off 打开或关闭echo,仅用echo不加参数则显示当前echo设置echo 信息 在屏幕上显示出信息echo 信息 >> 将信息保存到文件中findstr Hello 在文件中寻找字符串hellofind 文件名 查找某文件title 标题名字 更改CMD窗口标题名字color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白prompt 名称 更改的显示的命令提示符(把C:、D:统一改为:EntSky )ver 在DOS窗口下显示版本信息winver 弹出一个窗口显示版本信息(内存大小、系统版本、补丁版本、计算机名)format 盘符 /FS:类型 格式化磁盘,类型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFSmd 目录名 创建目录replace 源文件 要替换文件的目录 替换文件ren 原文件名 新文件名 重命名文件名tree 以树形结构显示出目录,用参数-f 将列出第个文件夹中文件名称type 文件名 显示文本文件的内容more 文件名 逐屏显示输出文件dosKEY 要锁定的命令=字符doskey 要解锁命令= 为DOS提供的锁定命令(编辑命令行,重新调用win2k命令,并创建宏)。 如:锁定dir命令:doskey dir=entsky (不能用doskey dir=dir);解锁:doskey dir=taskmgr 调出任务管理器chkdsk /F D: 检查磁盘D并显示状态报告;加参数/f并修复磁盘上的错误tlntadmn telnt服务admn,键入tlntadmn选择3,再选择8,就可以更改telnet服务默认端口23为其它任何端口exit 退出程序或目前,用参数/B则是退出当前批处理脚本而不是 路径可执行文件的文件名 为可执行文件设置一个路径。 cmd 启动一个win2K命令解释窗口。 参数:/eff、/en 关闭、开启命令扩展;更我详细说明见cmd /?regedit /s 注册表文件名 导入注册表;参数/S指安静模式导入,无任何提示;regedit /e 注册表文件名 导出注册表cacls 文件名 参数 显示或修改文件访问控制列表(ACL)——针对NTFS格式时。 参数:/D 用户名:设定拒绝某用户访问;/P 用户名:perm 替换指定用户的访问权限;/G 用户名:perm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;例:cacls D: /D pub 设定d: 拒绝pub用户访问。 cacls 文件名 查看文件的访问用户权限列表REM 文本内容 在批处理文件中添加注解netsh 查看或更改本地网络配置情况

C语言这个怎么写

#include#include#include#include#include#include#include#include#include#include#include#include#definePACKET_SIZE4096#defineMAX_WAIT_TIME5#defineMAX_NO_PACKETS3charsendpacket[PACKET_SIZE];charrecvpacket[PACKET_SIZE];intsockfd,datalen=56;intnsend=0,nreceived=0;structsockaddr_indest_addr;pid_tpid;structsockaddr_infrom;structtimevaltvrecv;voidstatistics(intsigno);unsignedshortcal_chksum(unsignedshort*addr,intlen);intpack(intpack_no);voidsend_packet(void);voidrecv_packet(void);intunpack(char*buf,intlen);voidtv_sub(structtimeval*out,structtimeval*in);voidstatistics(intsigno){printf(\n--------------------PINGstatistics-------------------\n);printf(%dpacketstransmitted,%dreceived,%%%dlost\n,nsend,nreceived,(nsend-nreceived)/nsend*100);close(sockfd);exit(1);}/*校验和算法*/unsignedshortcal_chksum(unsignedshort*addr,intlen){intnleft=len;intsum=0;unsignedshort*w=addr;unsignedshortanswer=0;/*把ICMP报头二进制数据以2字节为单位累加起来*/while(nleft>1){sum+=*w++;nleft-=2;}/*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/if(nleft==1){*(unsignedchar*)(&answer)=*(unsignedchar*)w;sum+=answer;}sum=(sum>>16)+(sum&0xffff);sum+=(sum>>16);answer=~sum;returnanswer;}/*设置ICMP报头*/intpack(intpack_no){inti,packsize;structicmp*icmp;structtimeval*tval;icmp=(structicmp*)sendpacket;icmp->icmp_type=ICMP_ECHO;icmp->icmp_code=0;icmp->icmp_cksum=0;icmp->icmp_seq=pack_no;icmp->icmp_id=pid;packsize=8+datalen;tval=(structtimeval*)icmp->icmp_data;gettimeofday(tval,NULL);/*记录发送时间*/icmp->icmp_cksum=cal_chksum((unsignedshort*)icmp,packsize);/*校验算法*/returnpacksize;}/*发送三个ICMP报文*/voidsend_packet(){intpacketsize;while(nsendSleep(1);/*每隔一秒发送一个ICMP报文*/}}/*接收所有ICMP报文*/voidrecv_packet(){intn,fromlen;externinterrno;signal(SIGALRM,statistics);fromlen=sizeof(from);while(nreceivedip_hl<<2;/*求ip报头长度,即ip报头的长度标志乘4*/icmp=(structicmp*)(buf+iphdrlen);/*越过ip报头,指向ICMP报头*/len-=iphdrlen;/*ICMP报头及ICMP数据报的总长度*/if(len<8)/*小于ICMP报头长度则不合理*/{printf(ICMPpackets\slengthislessthan8\n);return-1;}/*确保所接收的是我所发的的ICMP的回应*/if((icmp->icmp_type==ICMP_ECHOREPLY)&&(icmp->icmp_id==pid)){tvsend=(structtimeval*)icmp->icmp_data;tv_sub(&tvrecv,tvsend);/*接收和发送的时间差*/rtt=_sec*1000+_usec/1000;/*以毫秒为单位计算rtt*//*显示相关信息*/printf(%dbytefrom%s:icmp_seq=%uttl=%drtt=%.3fms\n,len,inet_ntoa(_addr),icmp->icmp_seq,ip->ip_ttl,rtt);}elsereturn-1;}main(intargc,char*argv[]){structhostent*host;structprotoent*protocol;unsignedlonginaddr=0l;intwaittime=MAX_WAIT_TIME;intsize=50*1024;if(argc<2){printf(usage:%shostname/IPaddress\n,argv[0]);exit(1);}if((protocol=getprotobyname(icmp))==NULL){perror(getprotobyname);exit(1);}/*生成使用ICMP的原始套接字,这种套接字只有root才能生成*/if((sockfd=socket(AF_INET,SOCK_RAW,protocol->p_proto))<0){perror(socketerror);exit(1);}/*回收root权限,设置当前用户权限*/setuid(getuid());/*扩大套接字接收缓冲区到50K这样做主要为了减小接收缓冲区溢出的的可能性,若无意中ping一个广播地址或多播地址,将会引来大量应答*/setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size));bzero(&dest_addr,sizeof(dest_addr));dest__family=AF_INET;/*判断是主机名还是ip地址*/if(inaddr=inet_addr(argv[1])==INADDR_NONE){if((host=gethostbyname(argv[1]))==NULL)/*是主机名*/{perror(gethostbynameerror);exit(1);}memcpy((char*)&dest__addr,host->h_addr,host->h_length);}else/*是ip地址*/memcpy((char*)&dest_addr,(char*)&inaddr,host->h_length);/*获取main的进程id,用于设置ICMP的标志符*/pid=getpid();printf(PING%s(%s):%dbytesdatainICMPpackets.\n,argv[1],inet_ntoa(dest__addr),datalen);send_packet();/*发送所有ICMP报文*/recv_packet();/*接收所有ICMP报文*/statistics(SIGALRM);/*进行统计*/return0;}/*两个timeval结构相减*/voidtv_sub(structtimeval*out,structtimeval*in){if((out->tv_usec-=in->tv_usec)<0){--out->tv_sec;out->tv_usec+=;}out->tv_sec-=in->tv_sec;}/*-------------TheEnd-----------*/

求C语言延时程序,要求如下:

#includestdio.h#(){ char c; int flag; c=getchar(); if(c==A)flag=1; if(c==B)flag=2; switch(flag) { case 1:Sleep(1000);printf(AAAAAA);break; case 2:Sleep(2000);printf(BBBBBB);break; }}

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐