公司安排开始做服务器,没有接触过这些东西。从零开始学习。
项目是做个聊天系统客户端用flex,服务器用C++,让我先出Demo。
服务器部分参照Windows网络编程一书中的select例子,基本一样,只是把例子中的的单个回应消息改成了群发消息。
虽然我对select模型还不熟悉,但是我知道如果要在一个套接字上发消息就必须设置FD_SET WriteSet,如果要在一个套接字上读消息就必须设置FD_SET ReadSet,设置就是调用函数FD_SET(SOCKET S, FD_SET* Set)。
设置这个结构的目的相当于设置一张socket的列表,调用select函数,系统就会管理这个列表里面的socket。
接收消息的过程是循环遍历所有端口,如果有端口有数据接收进来而且这个端口存在于读的列表中,则去读取数据。
如果有端口要发送数据,则先看看这个端口是不是在写列表里,如果在则发送数据,否则不发。
select模式有端口数限制,FD_SIZE被定义为64,如果不去修改这个系统定义的宏,这FD_SET结构里面最多只能存64个端口。
我把它改成1000试过,可以接收1000个端口,不知道这样子会不会有什么问题。
经理的意见是改成完成端口。
我又按照书上的完成端口示例弄出一个完成端口的服务器来,
我理解的完成端口就是把监听端口接收进来的客户端套接字绑定到一个完成端口上并开始接收消息,这个完成端口通过重叠IO机制来通知是否有消息到达。
完成端口在底层做的事情应该类似于select模型就是遍历所有和他绑在一起的端口。不知道我的理解对不对,恳请各位看到的指教。
我似懂非懂的看了几章感觉有用的东西 不过我感觉 这两本书是应该需要好好看完的,不会的东西太多了
另外的一些体会:
消息要先弄成消息队列,一个线程专门处理消息,一个线程专门处理接收数据,这样能保持处理消息的过程同步。
第一次搞服务器于是就第一次搞了多线程。线程同步比较重要,我看了Win32 多线程程序设计的几章帮助很大,很实用,一下子就解决问题了。我觉得这个水很深,继续摸中。
对我有帮助的资料:
windows 网络编程 8章 Winsock I/O方法
Win32 多线程程序设计 4章 同步控制 6章 overlapped I/O 在你身后变戏法
http://www.100ksw.com/jsj/dj/2/C++/3/187681.shtml(简单的socket例子)
http://tongjian.javaeye.com/blog/367252(字节序问题)
我把书上的代码贴贴上来好了,省得以后到处找。
select模型
完成端口模型
从flex过来的数据中取int
//---------------------------------------------------分割线-----------------------------------------//
flex客户端代码
chat.mxml:
完毕!