Linux下ping程序的实现

前段时间有门计算机网络通信技术(软件),需要一个Linux下的Ping,仔细看了几天书和网上的代码,我写了个简化的版本,几乎没有任何的错误处理,全部使用库函数和系统预定义的结构体,比网上的要容易理解一些。要是有的人想迅速理解ICMP实现的Ping程序,看这个版本能比较快的找到头绪。

大致说明一下,程序的结构为:

1、定义原始套接字,使用ICMP协议

sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

2、填充ICMP报头,记录当前系统时间,ICMP报头中的type设置为ICMP_ECHO,也就是要求对方主机回复一个type为ICMP_ECHOREPLY的包

sendtime = (struct timeval *)(sendbuf+sizeof(struct icmphdr));
gettimeofday(sendtime, NULL);

3、使用sendto函数发送,然后使用recvfrom函数接受回应

4、再次读取系统时间,计算数据包往返的时间

5、循环若干次

具体的代码请下载(下列链接任一均可):

1、C语言Linux的Ping程序源代码–LitePing

2、源代码下载点2

3、CSDN资源下载

Ubuntu 7.10 i386版、SuSE 10 Enterprise版测试通过,搜索关键字”Linux Ping 源代码”。

Tags: , ,

WIN32API学习日记060723

今天看了《Windows程序设计》的第二章,遇到了一点问题,主要是在书上的这种形式的函数中:

  1. int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...) { TCHAR szBuffer [1024] ; va_list pArgList ; va_start (pArgList, szFormat) ; _vsntprintf (szBuffer, sizeof (szBuffer) / sizeof (TCHAR), szFormat, pArgList); va_end (pArgList) ; return MessageBox (NULL, szBuffer, szCaption, MB_ICONINFORMATION) ; }

疑点有两处,一是int后面的CDECL属于什么样的语法格式,在谭浩强版的《C程序设计》中并没有说到过这种形式的函数写法,而WinMain()函数一般也写作:

  1. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) ;

在网上搜索后了解到,这个位置的参数是函数调用约定,主要是规定编译时用于参数的堆栈的管理方式,由于编译原理还没有学,只是看了一个大概的意思。CDECL是缺省的调用约定,允许不确定的参数数量。

还有一点没有见过的是参数列表最后的”…”,虽然能够大致猜到这个表示了不确定的参数数目,但是具体是什么意思,语法应该是什么样,提供在前面的参数有什么用,都不是很清楚。

书上关于这个提到两句话:


The va_list, va_start, and va_end macros (defined in STDARG.H) help in working with this stack pointer.

The va_start macro sets pArg to point to the variable on the stack right above the szFormat argument on the stack.

不过看了以后还是不是很理解,最后在CSDN找到了答案。《C语言之可变参数问题》

我理解的是这样的:pArgList存储了参数列表中szFormat后面的各个参数,然后被作为最后一个参数传递到_vsntprintf()中,作为参数(有点像是把主函数的参数列表copy到这个子函数中)。

PS:不知道是我使用的问题还是coolcode的问题,为什么怎么写都没办法得到想要的代码效果呢。郁闷。

Tags: , ,

WIN32API学习日记060719

今天开始正式抱着《WINDOWS程序设计》(作者:Charles Petzold)这本书坐在电脑前,认真的敲起了键盘。

今天看的时间不长,第一章书已经自己看了好几遍,可是总觉得看了就会忘掉。今天照着书把第一章的那个仅仅使用了MessageBox()的程序敲了进去,研究了一下MessageBox()这个函数,然后自己写了一个小程序,将MessageBox()第四个参数的不同取值的效果显示出来,其实只是重复调用同一个函数罢了,并没有什么技术含量。

MessageBox()中,’\n’是可以用来换行的,不过我想在windows编程中应该会有其他的办法的吧。

第一天就只有这么简单的收获,希望我的理解能力能够高一点……

附,MessageBox()函数

  1. <br/>int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);

Tags: , ,
    主题制作者:Directory JournalElegant Directory