如果按照上面的一讲 你如果把环境搭建好了,下面我们就正式开始客户端的搭建 首先我献给大家画一张我的客户端实现的流程图
我PS 画的大家不要见怪啊 不过流程就是这样的
搭建看到我上面的框架图的时候 就知道我的大概设计思路,
boy 在这里强调一点 这个是用异步的结构实现 其中线程类 我是参照java 里面的方法。
好了废话不多 首先先上 BSD SOCKET 这个核心类
- /*
- *definefileaboutportablesocketclass.
- *description:thissockissuitbothwindowsandlinux
- *design:odison
- *e-mail:odis[email protected]>
- *
- */
- #ifndef_ODSOCKET_H_
- #define_ODSOCKET_H_
- #ifdefWIN32
- #include<winsock2.h>
- typedefintsocklen_t;
- #else
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<netdb.h>
- #include<fcntl.h>
- #include<unistd.h>
- #include<sys/stat.h>
- #include<sys/types.h>
- #include<arpa/inet.h>
- intSOCKET;
- //#pragmaregiondefinewin32constvariableinlinux
- #defineINVALID_SOCKET-1
- #definesOCKET_ERROR-1
- //#pragmaendregion
- #endif
- classODSocket{
- public:
- ODSocket(SOCKETsock=INVALID_SOCKET);
- ~ODSocket();
- //Createsocketobjectforsnd/recvdata
- boolCreate(intaf,inttype,87); font-weight:bold; background-color:inherit">intprotocol=0);
- //Connectsocket
- boolConnect(constchar*ip,unsignedshortport);
- //#regionserver
- //Bindsocket
- boolBind(unsignedshortport);
- //Listensocket
- boolListen(intbacklog=5);
- //Acceptsocket
- boolAccept(ODSocket&s,87); font-weight:bold; background-color:inherit">char*fromip=NULL);
- //#endregion
- intSelect();
- //Sendsocket
- intSend(char*buf,87); font-weight:bold; background-color:inherit">intlen,87); font-weight:bold; background-color:inherit">intflags=0);
- //Recvsocket
- intRecv(intflags=0);
- //Closesocket
- intClose();
- //Geterrno
- intGetError();
- //#pragmaregionjustforwin32
- //InitwinsockDLL
- staticintInit();
- //CleanwinsockDLL
- intClean();
- //#pragmaendregion
- //Domainparse
- boolDnsParse(char*domain,87); font-weight:bold; background-color:inherit">char*ip);
- ODSocket&operator=(SOCKETs);
- operatorSOCKET();
- protected:
- SOCKETm_sock;
- fd_setfdr;
- };
- #endif
第二个 Send 方法 这个主要是用来发送数据的
第三个方法Recv 这个主要是用来接收数据的、
第四个方法Select 这个主要用来判断当前socket 的状态,这里我只用了 判断是否有数据回来这个方法。
这里说明一下 一旦调用recv 这个方法 他会一直等到读取到数据,所以在我们正常的开发游戏过程中。我们都会把它放到单独的线程中来执行。防止我们的主线程卡死。
好下面介绍一下我们的 连接线程类
- #pragmaonce
- #include"ODSocket.h"
- #include"pthread.h"
- classSocketThread
- {
- public:
- ~SocketThread(void);
- staticSocketThread*GetInstance();
- intstart();
- ODSocketgetSocket();
- intstate;//0表示连接成功1表示连接失败
- ODSocketcsocket;
- voidstop();//函数中止当前线程。
- private:
- pthread_tpid;
- staticvoid*start_thread(void*);//静态成员函数,相当于C中的全局函数
- SocketThread(staticSocketThread*m_pInstance;
- };