帮图书馆义务劳动……

这次图书馆老师给了个很耗时间的项目:她给了我一本书,讲的都是上海的老建筑,然后让我把里面的资料都输入到电脑里去…… 最累的就是,连建筑物描述都要…… 那可是大段大段的文章啊…… 我输了3个半天,才输了33幢,共有101幢啊…… 而且输这些资料非常累人…… 我们看上去有那么无所事事么?…… 不过图书馆老师又和我说了件事:让我做个项目,改善食堂收费。怎么不是没有项目,就是几个一起上啊…… 现在要少科站、学校两头做项目了,学校的项目还被要求独立完成…… 还有图书馆的义务劳动…… So many things to do …..

使用Winsock API发送/接收UDP包

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

少科站的Project和Delphi 2005 Personal

在少科站接了个项目,和JohnJin、Hearson一起搞,打算用Delphi做。上网一看,发现Delphi竟然出了免费的版本(Personal),心想Borland什么时候这么好了…… 免费申请Key的时候才发现,这个Personal Edition不是能够公开下载的,据说附在DVD版的PC Plus杂志(没听说过……),以及澳洲个人电脑杂志(也没有听说过……)里面。 后来终于找到一个链接,结果下下来是德文的,提供了个补丁能变成英文,但是还是剩了不少德文(Yes->Ja Declare->Deklariert)…… 启动之后,感觉性上和Delphi 6大不相同,倒是很像VS.NET,这个么…… 不是很好吧,但是用起来还算习惯。除了按下’.’之后的提示之外,现在还有某个东西在哪里定义的详细说明,以及参数什么什么的…… 比原来漂亮不少。