存档

‘C’ 分类的存档

DDD强大的图形调试工具

2009年45月12日 frankyue 4 条评论

一直没有写东西,主要是不知道写什么,而且没有动力,就懒得写了!不过不能浪费这个空间和域名,还是应该动动手过来!

前段时间一直在复习,每天早上6点多爬起来和别人去抢位子,这帮人起的一天比一天早,7点开始一直被迫到6点15起来。不过到也不累,累的是那书,看的头晕了快!

嘻嘻今天逃出来偷闲下跑杭图和TX一起研究技术。前几天在看代码之美的时候曾看到关于DDD的介绍,一时来了兴趣,今天花了一天的时间在那里研究DDD,虽然只是知道皮毛,但已够让我吃惊的了!这个古老的调试工具实在是太牛了,虽然最初只是一个德国研究生的毕业设计作品,只是对GDB的一个外壳包装,但是历经了将近14年的开发,它的功能已经远远超出了当初的设想!

阅读全文…

分类: C, 开源项目 标签:

留在这 过些时候解决

2008年00月26日 frankyue 没有评论

宏定义还不知道怎么回事,今天接触到select函数,然后碰到几个宏函数(FD_SET,FD_CLR,FD_ISSET),下面就是他的定义 不是很懂先用了再说,放在这,提醒自己去解决

FD_SET 打开类型fd_set的某一位
FD_ZERO初始化fd_set
FD_ISSET测试结构fd_set中的描述字

#define FD_CLR(fd, set) do { \
u_int __i; \
for (__i = 0; __i < ((fd_set FAR *)(set))->;fd_count ; __i++) { \
if (((fd_set FAR *)(set))->;fd_array[__i] == fd) { \
while (__i < ((fd_set FAR *)(set))->;fd_count-1) { \
((fd_set FAR *)(set))->;fd_array[__i] = \
((fd_set FAR *)(set))->;fd_array[__i+1]; \
__i++; \
} \
((fd_set FAR *)(set))->;fd_count–; \
break; \
} \
} \
} while(0)

#define FD_SET(fd, set) do { \
u_int __i; \
for (__i = 0; __i < ((fd_set FAR *)(set))->;fd_count; __i++) { \
if (((fd_set FAR *)(set))->;fd_array[__i] == (fd)) { \
break; \
} \
} \
if (__i == ((fd_set FAR *)(set))->;fd_count) { \
if (((fd_set FAR *)(set))->;fd_count < FD_SETSIZE) { \
((fd_set FAR *)(set))->;fd_array[__i] = (fd); \
((fd_set FAR *)(set))->;fd_count++; \
} \
} \
} while(0)

#define FD_ZERO(set) (((fd_set FAR *)(set))->;fd_count=0)

#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set))

分类: C, 嵌入式 标签:

关于checksum

2008年58月15日 frankyue 没有评论

最近一段时间很忙没来写东西了,发下最近写的一个东西,一个UDP的CHECKSUM(校验和)。

在网络传送的数据包为了保证传送正确都含有效验字段,IP、arp、tcp等每个数据段都有自己的效验和

刚开始找来个现成的IP数据包的校验和,不过后来才知道UDP和IP的校验和还有差别,所有又重新来

UDP报文的头由 发送端端口(2字节),目标端口(2字节),UDP包长度(2字节),校验和(2字节)4部分组成。
校验和的值由伪IP头,UDP头和UDP数据三部分的字串以16bit作单位进行相加后取反码(one’s complement )得到。若数据长度为基数,则最后补一个字节的0。

老师要求都用C语言写,古老的语言阿,都N年没用了,不过嵌入式的东西都用他来完成,虽然我还没接触到嵌入式的东西,用了些之前从没用过的unsigned short,取反等操作,都是接触底层的东西按照网上了解的算法得出如下:

#include
#define INDEXUDPLANG 12
void ChecksumForudp(unsigned short *str1,unsigned short *str2,int len)
{
unsigned short *sbuf;
int i;
unsigned int hi=0, lo=0, hicarry, locarry;

sbuf = (unsigned short *) str1;

for (i = 0 ; i < len ; i += 2)
{
if( i != INDEXUDPLANG )
{
if( i != len-2)
{
hi += sbuf[i];
lo += sbuf[i+1];
}
else
{
hi += sbuf[i];
lo += sbuf[i+1];
}
}
else
{
hi +=sbuf[i]+sbuf[i];//加两次包长
lo +=sbuf[i+1]+sbuf[i+1];//加两次包长
}
}

lo += 0×11; //加UDP协议值0×0011

hicarry = hi >> 8; //提取进位
locarry = lo >> 8;

while (hicarry || locarry)
{ //将进位循环加回
hi = (hi & 0xFF) + locarry;
lo = (lo & 0xFF) + hicarry;
hicarry = hi >> 8;
locarry = lo >> 8;

}

sbuf[INDEXUDPLANG]= (~hi) & 0xff; //将checksum高位放入
sbuf[INDEXUDPLANG+1]= (~lo) & 0xff; //将checksum低位放入

str2 = str1;
}
int main()
{
//unsigned short str[]= {0×0a,0×99,0×35,0×0f,0×0a,0×00,0×00,0xac,0×20,0xdb,0×23,0xf1,0×00,0×0b,0×00,0×00,0×18,0×00,0×23};
unsigned short str[]= {0×0a,0×99,0×35,0×0f,0×0a,0×00,0×00,0xac,0×20,0xdb,0×23,0xf1,0×00,0×7b,0×00,0×00,0×0a,0×00,0×21,0×12
,0×01,0×10,0×13,0×58,0×04,0×80,0×83,0xd4,0×60,0×04,0×81,0×83,0xd4,0×60,0×02,0×82,0×00,0×02,0×83,0×05,0×02,0×84,0×01,0×80
,0×80,0×83,0×99,0×81,0xea,0xa9};
unsigned short *str1,*str2;
str1=str;
int i = 0;
ChecksumForudp(str1,str2,50);

printf(“%x\n”,str1[12]);
printf(“%x\n”,str1[13]);
printf(“ANSWER IS 35B8!\n”);
}

还有个BUG,就是UDP包最长为65535,在进行加法hi和lo是会不会超过int 长度,在得到hicarry和locarry会不会使数据丢失,总想不明白会不会,自己数学太差了!我再琢磨琢磨!

得去装个代码查看插件,这里发出来的格式都变了郁闷

分类: C 标签: