Happy New Year !!!
新年快乐!
傻了……
Night
晚上,看完一本书。
抬头看去,十一点三刻。
轻声带好洗漱用品走出寝室,怕吵醒他人。
走过窗口,忽然发现窗外景色很特别,妙处难以言说。
睡前一看,十二点整。
高三的夜生活。
By mobile
帮图书馆义务劳动……
这次图书馆老师给了个很耗时间的项目:她给了我一本书,讲的都是上海的老建筑,然后让我把里面的资料都输入到电脑里去…… 最累的就是,连建筑物描述都要…… 那可是大段大段的文章啊…… 我输了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了。
然后要指明绑定的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