具体的看这里 这里有图片
http://www.turinger.com/forum_view.asp?forum_id=16&view_id=32
最近本人在写一个基于SDK的聊天室程序
程序流程如下
我打算使用阻塞套结字的方式去完成,采用双线程,一个线程用来接受客户端的消息,另外一个线程用来处理接受到的消息。为了实现大规模处理能力,采用消息队列的形式。接受接受客户端消息的线程在每次接受到消息后,把消息存放到消息队列中,轮到处理消息线程的时间片时,在消息队列中取出消息对客户端的消息进行相应的处理。
但是我感觉使用阻塞套结字处理会影响到处理速度。
大家有什么意见请提出来,本人不胜感谢,因为我马上就要开始写代码了,要是有什么缺陷到时候就比较麻烦了!!!
程序的框架我已经想好了
采用4个类
第一个类是socket的一般操作类
类代码
#include<Winsock2.h>
#include "resource.h"
struct ReceMessageData //接受数据包的结构
 {
  int iMessageType;//消息类型
  char szNickName[11];//客户端的昵称
  char szRecvBuffer[512]; //接收消息内容
 };
class BaseSocket 
{
public:
 BaseSocket();//构造函数
 ~BaseSocket();//析构函数
 DWORD InitSocketVersion();//协议协商
 BOOL GetLocalIP();//取得本主机IP
 BOOL InitSocket(HWND);   //创建并绑定socket
 BOOL SetIpAndPort(HWND);//在对话框中显示服务器的端口和IP地址
    BOOL RecvMessage();//接受消息的操作 FALSE代表没有消息,TURE代表有消息并保存消息到消息结构体中
private:
 SOCKET m_ServSocket;//服务器socket 
 char m_szLocalIp[20];//保存主机IP;
 int  m_iServPort;//服务器的端口
 ReceMessageData* RecvBuffer;//定义接受的数据结构
};第二个是保存在线用户消息的类
#include<Windows.h>
class SocketOnlineNode
{
 //public:
 friend class COnlineSocketChain;//设置为友员
private:
 SocketOnlineNode* m_Next;//指向下一个节点
 char m_szNickName[11];//客户端的昵称
 char m_szIP[20];//IP地址
 int  m_iPort;//端口号
};
class COnlineSocketChain
{
public:
 COnlineSocketChain();
    ~COnlineSocketChain();
 int     GetNodeNum();//返回节点的个数
 char*  GetIp(int);//取得第i个节点的SOCKET
 int    GetPort(int);//取得当前节点的端口
 BOOL    ModifyNickName(char*,char*,int);//根据IP和端口来修改用户昵称
 BOOL    AddSocket(char*,char*,int);//用户登陆时保存其昵称,IP和端口
 char*   FindAllNickName(char*,int);//根据ip和端口返回其昵称
 BOOL    DeleteSocket(char*,int);//根据ip和端口
private:
 SocketOnlineNode* m_FirstNode;//指向第一个节点的指针
};第三个类是客户端的消息队列类
class QueueNode
{
 friend class MessageChain;
private:
    int m_iMessageType;//消息类型
 char m_szRecvBuffer[512];//消息内容
 char m_szIP[20];//ip地址
 int  m_Port;//端口
 QueueNode* m_Next;//指向下一个结点
};
class MessageChain
{
public:
 MessageChain();
 ~ MessageChain();
 CheckMessage();//检查消息队列中是否有消息没有返回FALSE 反之返回TRUE
 AddMessage(QueueNode);//添加消息
 GetMessage(QueueNode);//取出消息
private:
 QueueNode* m_front;//头结点
 QueueNode* m_rear;//尾结点
};
第四个类是临界资源保护的类,现在还没写