2006年12月28日星期四

使用Winsock API发送/接收UDP包

其实Winsock这堆底层API和BSD都是一样的么…… 难怪令人怀疑这个是抄袭BSD的源代码……
UDP比较简单,只要bind一下,RP好的话就可以发了。
先 s: = socket(AF_INET,SOCK_DGRAM,0);
成功的话,s已经是一个可以用的socket了。


然后要指明绑定的addr
sa:sockaddr_in;
fillchar(sa,sizeof(sa),0);
sa.sin_family:=AF_INET;
sa.sin_port:=htons(port);
sa.sin_addr.S_addr:=inet_addr(PChar(address));
address为地址(a.b.c.d形式),port为端口号。而htons作用是把以主机存储方式存储的port转换为网络上通用的port形式。


接着就可以bind了
bind(s,sa,sizeof(sa));
成功的话,netstat -an能够看见你所bind的端口号。


bind完了,这个socket和端口也就建立了联系,所有扔到这个口的UDP包都会给这个socket


接着可以直接用recv收。但是假如没有数据过来,程序就会卡在这里,多不好……
所以用WSAAsyncSelect来指明当收到包之后给窗口发消息。
WSAAsyncSelect(s,form1.Handle,WM_RECEIVED,FD_READ);
WM_RECEIVED自己定义,FD_READ说明只关心收到消息。


接着让窗口收到这种消息的时候运行给定的proc
先定义这个proc:
Procedure TForm1.OnMyMessage(var Msg:TMsg;var Handled:Boolean);
然后在FormCreate的时候告诉窗口:
application.OnMessage:=OnMyMessage;
这样就完了


收到消息后:
  if Msg.message=WM_RECEIVED then
(万一不是呢……)
lParam的底字节代表具体情况(我们只关心FD_READ,所以这里只会是FD_READ)
高字节为出错信息
wParam为收到消息的那个socket,我们这里只有s,所以其实也一样
然后就可以recv了
recv(Msg.wParam,data,MAXMSG,0);
不出意外,消息就在data里了~


好好处理消息吧~


记得最后closesocket(s)哦~ 以免资源浪费~


 


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61586.aspx

2006年12月14日星期四

图标历险记

升级KDE到3.5.4,启动之后发现:图标不见了! 大部分图标都变成默认的空图标了……
于是去网上搜,似乎有人说KDE启动着的时候不能升级云云。费了半天劲,发现似乎KDE无法找到那些图标,可供选择的图标里也没有。去/usr/local/share/icons,来到crystalsvg目录,发现似乎就是系统知道的那些图标,而程序图标都在hicolor里面。最后想了一个暂时解决方法:把hicolor里面的东西都拷过去! 一混,就好了……
结论:电脑比较傻,骗骗电脑比较容易……


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61352.aspx

被libc弄得晕头转向……

编译 kports,结果 configure 检查QT的时候报错,查看config.log:libqt-mt.so: undefined ... __res_state
我一看,又是这个…… 从前见过,但从前加了 -pthread 就好了,现在怎么不行呢?然后,去网上找,什么都没有;去 /usr/lib和/lib和/usr/local/lib grep,都没有…… 汗……
于是去 /usr/src/lib/libpthread 里面找,一点都没有发现……
偶尔灵机一动,想到可能在别的库里面。于是到 /usr/src/lib 里面找,结果在 /usr/src/lib/libc/resolv/res_state.c 里面找到了。既然这样,为什么 /lib/libc.so.6 里面会grep不到??
尝试一下,重新编译安装libc,再试,好了!!
估计是上次没有 make buildword 的结果…… 以后一定make buildworld...


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61348.aspx

2006年12月10日星期日

FreeBSD中读取Ethernet Address的一种可行方法

#include <net/if.h>
#include <ifaddrs.h>
#include <net/if_dl.h>
#include <net/ethernet.h>

int main()
{
    struct ifaddrs *list;
    if(getifaddrs(&list) < 0)
    {
        perror("getifaddrs");
        return;
    }
        
    struct ifaddrs *cur;        
    for(cur = list; cur != NULL; cur = cur->ifa_next)
    {
        if(cur->ifa_addr->sa_family != AF_LINK)
            continue;
        char *name = cur->ifa_name;
        printf(name);printf("\n");
        char *addr;
        struct sockaddr_dl *sdl;
        sdl = (struct sockaddr_dl *)cur->ifa_addr;
                addr = ether_ntoa((const struct ether_addr *)LLADDR(sdl));
        printf(addr);printf("\n");
    }
        
    freeifaddrs(list);
    return 0;
}
看了TCP/IP Illustrated Vol 2,再看看源代码,才知道当 sa_family==AF_LINK 时,ifa_addr实际上是 struct sockaddr_dl  格式, 根据书里的写法,LLADDR宏是用来从sockaddr_dl获取ether_addr的位置,而ifa_addr里面的各个数的定义也清楚了……
struct sockaddr_dl {
    u_char    sdl_len;    /* Total length of sockaddr */
    u_char    sdl_family;    /* AF_LINK */ (当前版本AF_LINK=18, socket.h)
    u_short    sdl_index;    /* if != 0, system given index for interface */(我的rl0是1)
    u_char    sdl_type;    /* interface type */ (IFT_ETHER, 0x6, if_types.h)
    u_char    sdl_nlen;    /* interface name length, no trailing 0 reqd. */ (我的为3("rl0"))
    u_char    sdl_alen;    /* link level address length */ (ETHER_ADDR_LEN, 0x6)
    u_char    sdl_slen;    /* link layer selector length */ (0, 难道还是没有用?)
    char    sdl_data[46];    /* minimum work area, can be larger;
                   contains both if name and ll address */ ("rl0"+ether_addr...)
};
而LLADDR宏也就是把sdl_data偏移掉接口的名字,接下来就是接口的地址……
另外,struct ifaddrs和struct ifaddr很象,但是原来的ifa_ifp,也就是回指接口结构的指针没了。安全考虑? 为了区分内核和用户?
所以,坚信Linus的名言,有问题去看源代码!……
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61230.aspx

2006年12月2日星期六

An ugly way to get MAC Address in FreeBSD

char ethaddr[6];
    struct ifaddrs *list;
    if(getifaddrs(&list) < 0)
    {
        perror("getifaddrs");
    }
        
    struct ifaddrs *cur;        
    for(cur = list; cur != NULL; cur = cur->ifa_next)
    {
        if(cur->ifa_addr->sa_family != AF_LINK)
            continue;
        if(cur->ifa_name!=if_name)
            continue;
        int i;
        for (i=9;i<15;i++)
        ethaddr[i-9]=cur->ifa_addr->sa_data[i];
    }
        
    freeifaddrs(list);

I'll refer to some books to see the meaning of ifa_addr->sa_data when ifa_addr is an ethernet address...
Currently I konw:
sa_data:
0 byte 1
1 byte 0
2 byte 6 // addr len?
3 byte 3 // name len?
4 byte 6 // addr len?
5 byte 0
6,7,8 name[3]
9-14 addr[6]
... and something more...
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61231.aspx

2006年12月1日星期五

TheWorld 2 Beta 3 配合 Process Explorer 使用

TheWorld 2 Beta 3 上 MSN Space,每天 TheWorld 要死十几次。只好请来 Process Explorer。
有一次又死了,打开 Process Explorer,找到切换次数最多的线程——TheWorld的多线程用在这里不错~,结束,还不行。又找了一个,两个线程看上去都在msvcrt.dll:endthreadex里面。结束之后,TheWorld 竟然活了过来……
看来多线程还是不成熟啊…… 估计只结束前面那个就行了……


 


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61123.aspx

2006年11月29日星期三

The cry of the harddisk

学校里只要装了保护卡的机器,只要拷贝数据超过一定数量(xxxM),就会发出“咔咔”的声响。再过一会儿,系统不是蓝屏就是死机。蓝屏的故障也五花八门。没有装保护卡的机器就工作得很好。


这充分说明了目前保护卡的技术还有严重缺陷。不能好好用就不要开发么!而且这个现象出现在学校不同批次买的各种不同的保护卡上。每次都是在读硬盘的同时发出这样的声响,让人觉得是硬盘发出来的——不会是用喇叭发的吧…… 我怀疑这个对硬盘有损害,缩短硬盘寿命……


希望有一天,学校拆掉所有的保护卡,让所有的机器能够获得解放!~


 


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61112.aspx

2006年11月27日星期一

30% MP3 被毁了……

升级Amarok到1.4.3,播放列表里的信息都变成乱码了。到选项里面捣鼓一阵,记得从前有个编码选项的,现在不见了。去往上一查,原来新的Amarok因为作者实在忍受不了多个编码的麻烦,今后统一只支持UTF-8的ID3信息。
既然这样,我们只能紧跟潮流,把MP3转码。于是去网上下了几个转码的工具,进行转换。后来发现转换没有效果,导入之后还是乱码。进而发现一些MP3只剩了头上的16K,剩下的空间都变成了0……
为了找出这些坏了的MP3,我想出一个方法:用gzip压缩…… 压缩之后小于30K的都是坏的。结果,大约有100首坏了(总共250首),占大约400M(总共1.2G左右)……


事后发现,坏掉的原因主要是我的MP3文件在Fat32分区上的缘故,我还用的是zh_CN.GBK挂的分区。把MP3拷到ufs分区上,再转换、导入,一点问题也没有。有些在ufs导入是好的MP3,拷回到fat32再导入歌曲信息就成了乱码了…… 有些在Fat32上导入歌曲信息乱码的并且是中文文件名的,改成英文还是不好,在文件名里面加个下划线就好了…… faint…… BSD对Fat32的支持还有待改善啊……


 


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61050.aspx

2006年11月23日星期四

FreeBSD 的 locale

原来我设置locale的方法是setenv LC_ALL zh_CN.eucCN,但是这样陶喆的“喆”显示不出来,假如用eucCN挂硬盘(FAT32),连读出来都有问题。
于是改为setenv LC_ALL zh_CN.GB18030,这下基本上什么东西都和我说“locale 不支持”,比如libc说,Xlib说->Qt说,Gnome说(其实Xlib是支持的,只是没装好…… 后来删了重装就好了)。搞不清楚了,就跑到论坛上去问,结果被别人强烈BS,说使用LC_ALL违反设计理念等等…… 按照那位仁兄的建议,改成setenv LANG zh_CN.GB18030+setenv LC_CTYPE zh_CN.GBK之后,陶喆的问题基本上好了,但是SCIM还是叫不出来,只好最后改为setenv LANG zh_CN.GB18030+setenv LC_CTYPE zh_CN.GBK,这样似乎什么问题也没有了。


但是这样又有一个疑问:既然有zh_CN.GBK,zh_CN.GB18030有什么用?……


PS:挂硬盘自然也要用zh_CN.GBK才行…… 不过似乎zh_CN.GB18030也没什么问题


 


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/60958.aspx

2006年11月5日星期日

packages和ports的区别……

早上要编译gnomevfs,结果libORBits-2.so报告__res_state undefined。。。 很令人奇怪,后来想起来是用packages装的…… 干脆先删掉,然后到ports里面make install clean,再编译gnomevfs,结果就正常了…… 比较没有想法……
后来发现packages安装py-libxml也有这个问题,packages装的在python里面没有这个模块……

还是ports编译安装比较牢靠啊…… 但是ports实在太慢了……
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/60582.aspx

2006年10月6日星期五

关于eMule的欢迎信息(2)

首先,对VeryCD.com进行道歉。由于未了解事实真相,因为想当然的错误,导致误认为欢迎信息中指的是VeryCD版。致以最真挚的道歉!

通过LL同志的指出,我得知欢迎信息中指的是VAGAA。我没有听见过周围有人用VAGAA。VAGAA这样的行为严重违背了P2P的精神,更重要的是,它的行为危害了全国人民的利益和声誉,丢了中国人的脸!……

希望大家都不要使用vagaa! 只要没人用,自然会消失!……

参考:http://board.verycd.com/t366722.html
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/59934.aspx

2006年10月3日星期二

eMule 的欢迎信息……

莫名想起来开eMule,连接上 DonkeyServer No2,结果服务器发来的欢迎信息是这样的:

server version 17.14 (lugdunum)
Note to chinese users of this server.
It seems many chinese people use a modified eMule that abuse servers.
Unfortunatly we cannot tell what is the name of this mod.
This *buggy* version sends automatic searches, over and over and servers suffer a LOT
Please use standard emule program 0.47b, or we will be forced to deny access
to this server for *all* chinese people. That would be bad :(
Thank you
Note : eMule 0.47b is here : http://www.emule-project.net/download
Note : If you already use a standard 0.47b eMule, or a mod based on 0.47b,
please ignore this message. Have Fun
连接到本服务器的中国用户请注意:
大多数中国用户使用的某种电骡的修改版本正在向服务器滥发信息。
这种有问题的电骡客户端不断的向服务器提交自动查询,这给服务器增加了很大负担。
请您使用电骡的官方版本,否则我们只好被迫封掉?所有?的中国用户,使你们无法连接到本服务器。
请不要让这样的事情发生。:(
eMule官方版在这里下载:http://www.emule-project.net/download
如果你已经在使用0.47b的官方版本,或者基于0.47b的修改版本,请忽略这条信息。祝你开心。:)

无语……
大多数中国用户用的是什么版本呢? 不出意外,应该是eMule VeryCD版吧……
这个说明什么问题,………………
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/59911.aspx

2006年9月30日星期六

Mblogger.cn 的 XML-RPC接口

找了半天,终于找到了Mblogger.cn的XML-RPC接口,以后可以用 Performancing 发了~
我的接口: http://computer.mblogger.cn/henryhu/services/metablogapi.aspx

参考:http://tabletdev.com/michael/archive/2005/03/02/399.aspx
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/59884.aspx

2006年5月27日星期六

IAA? 蓝屏?

最近每天1-2次蓝屏…… 异常郁闷……错误是PAGE_FAULT_IN_NONPAGED_AREA(0x00000050)
报错的是IdeChnDr.sys(Intel Application Accelerator 驱动)
因为是硬盘驱动问题…… Dump都没有 没想法啊
上网转了一大圈,试了一下Verifier,结果立马蓝屏…… 少几个驱动,结果蓝屏晚了一些…… 放弃Verifier……
最终结论:卸载IAA……
PS:20060528 到目前为止没有出问题
PPS:20060602 还是没有出问题
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/54696.aspx

2006年5月22日星期一

Google.com 被封与学校网络限制

Google.com上不去,Google.cn能上去…… 上两天上什么网站,估计和这个情况一样。连接正常,三次握手正常,但是总在最后一次附近发过来一个R包。对TCP/IP的连接响应不熟,但是按道理上来说假如服务器要R的话,为什么要先发一个S?而且有时候R比S早,有时候比S晚…… 估计不是服务器自己发的吧……


上周五,学校门口贴出通告,大意是“由于某些老师上网看在线电影,导致网络流量过大,大学部限制了我们的带宽,导致上网变慢。现在,停止对外国网站的访问。请老师不要在线看电影!” …… 非常搞笑哈……


 


Old Blog Link: http://computer.mblogger.cn/henryhu/posts/54439.aspx

2006年4月15日星期六

CERNET2 So far?

刚才用 VisualRoute Trace www.cernet2.net,结果先到了美国,然后到了香港,接着到了澳大利亚,最终回到了北京……
难道这样比直接连接快?……
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/53367.aspx

2006年3月27日星期一

VOS 记录

VOS就是难练…… 到现在大约两三个月,Canon in D 到了82%,
Old Blog Link: http://computer.mblogger.cn/henryhu/posts/52763.aspx