本来一直想在阻塞模式下码一个能够互相聊天的工具出来,
后来看了非阻塞模式的概念才知道,用阻塞模式开发互动的聊天工具是不方便的。
假设你的服务器要等待用户输入,然后将消息发送给客户端,
这时候send()进程就会一直等待你的输入然后发送,这时候线程就阻塞了,
如果客户端此时给你发消息,你处于阻塞状态,客户端就会报错,
服务器没法收到这个信息,聊天也就不从谈起。
非阻塞模式开发中讲,要用多线程的思想来解决这个问题,
将新建的socket使用函数(如ioctlsocket(SOCKET))将你新建的套接字转换成非阻塞模式,
这时候,如果你使用一个recv或者send函数的时候,socket会不断的尝试recv和send,
不成功就返回一个WSAEWOULDBLOCK,然后继续尝试;
成功之后就会接受或者发送出数据。
如果你创建了两个线程,一个接收,一个发送,都在不停的尝试收发数据,
就可以实现实时聊天,
当时中间还有很多多线程技术细节需要实现,
书中的实例用了一个类,CClient,还有一些句柄、CreateThread()函数等功能我还不是很清楚,
暂时没能读懂那个例子,当然代码一直在敲,书中代码是一段一段的不完整,有些东西需要你自己补充,
让我有时候编起来有点迷茫,今天争取把客户端敲完了,然后改改错,试着把客户端的原理理解了。
今天积累一点小知识,
1.socket报错的时候,SOCKET_ERROR我发现是socket已经new好了之后才会报这个错,
如果你是SOCKET s=socket(2,SOCK_STREAM,0);这时候如果出错,s的值报错为INVALID_SOCKET。
可能是因为socket还没建好,称不上socket error吧。
2.accept函数使用的时候遇到了一点点问题,accept函数第一个参数是要用来监听的socket,第二个参数是如果server接收了某个
client的连接请求,那么client的地址就给了addr,也就是第二个参数,第三个参数是sockaddr_in的长度,类型是int*,
在操作的时候,第三个变量我想用(int*)sizeof(sockaddr_in),但是不行,说没法类型转换,
书上用了两步,int clientLen=sizeof(sockaddr_in);
函数中第三个参数用&sockaddr_in,就可以编译通过了。
这两天师兄给我讲了更多的6k的知识,还有些java的背景,
师兄是虔诚的java程序员,讲起java来逸兴遄飞兴高采烈,
我境界不高,还体会不到java到底哪有这么大的魅力。
师兄说,选这个课题,是因为java有前途,是一种应用前景十分广泛的语言,
在嵌入式领域、网络领域都有巨大的市场,嵌入式领域以手持设备居多,java的平台无关性,
使得你写好了一段程序可以在任何装有java运行环境的地方跑,这是有点,
但是platform-independent是建立在牺牲效率和内存的基础上,
java平台无关,所以就要求jvm平台相关,
不同的系统装不同的jvm,将java编译好的class文件翻译成本地系统、本地cpu能够认识的指令集,
指令集有很多,每种处理器可能认识的指令集不一样,于是jvm就有各种版本,
java牺牲了中间件的效率和主机内存,换来了平台无关性,
为了克服效率和内存的问题,我们设计javasoc,使用硬件实现虚拟机,
直接将.class文件通过查表翻译成我们芯片认识的指令集,
当然我们的芯片只认识java程序,其他的东东不能跑,
这样只要是java程序来了,不用装虚拟机,直接可以在我们的芯片上跑。
当然仅仅有个芯片是不够的,你给别人一个芯片,别人也不知道怎么用,
于是我们设计soc,把整个系统都给你搭好了,将时钟、复位、各种外设控制器都给你集成好了,放到芯片里面,
这样你把芯片放到板上就能够跑。
当然前提是你得使用我们提供的java类库,毕竟驱动总得有嘛,驱动是我们用java写的。