• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 96  文章 - 255  trackbacks - 0
            <2010年6月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            E-mail:zbln426@163.com QQ:85132383 長期尋找對戰略游戲感興趣的合作伙伴。

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492145
            • 排名 - 38

            最新評論

            閱讀排行榜

            評論排行榜

            //Filename: SockClass.hpp

            #ifndef SOCK_CLASS_HPP
            #define SOCK_CLASS_HPP

            #include 
            <iostream>
            #include 
            <winsock2.h>

            namespace sockClass
            {
            void error_info(const char* s);
            }

            class WinsockAPI{
            private:
                WSADATA wsaData;
            public:
                WinsockAPI(
            int low_byte = 2int high_byte = 2);
                
            ~WinsockAPI();
                
            void showVersion() const;
            };

            class BaseSock{
            protected:
                
            int sockFD;
            public:
                BaseSock();
                
            virtual ~BaseSock() = 0;
                
            const int& showSockFD() const;
            };

            class TCPListenSock: public BaseSock{
            private:
                sockaddr_in listenSockAddr;
            public:
                TCPListenSock(unsigned 
            short listen_port);
                
            ~TCPListenSock();
                
            void TCPListen(
                    
            int max_connection_requests = 10const;
            };

            class TCPServerSock: public BaseSock{
            private:
                sockaddr_in clientSockAddr;
            protected:
                
            char* preBuffer;
                
            int preBufferSize;
                mutable 
            int preReceivedLength;
            public:
                TCPServerSock(
                    
            const TCPListenSock& listen_sock,
                    
            int pre_buffer_size = 32);
                
            virtual ~TCPServerSock();
                
            int TCPReceive() const;
                
            int TCPSend(const char* send_data,
                        
            const int& data_length) const;
            };

            #endif //SockClass.hpp

            //Filename: SockClass.cpp

            #include 
            "SockClass.hpp"

            //sockClass

            namespace sockClass
            {
            void error_info(const char* s)
            {
                std::cerr 
            << s << std::endl;
                
            throw WSAGetLastError();
            }
            }

            //class WinsockAPI

            WinsockAPI::WinsockAPI(
            int low_byte, int high_byte)
            {
                
            const WORD wVersionRequested = MAKEWORD(low_byte, high_byte);
                
            int wsa_startup_err = WSAStartup(wVersionRequested, &wsaData);
                
            if (wsa_startup_err != 0) {
                    std::cerr 
            << "WSAStartup() failed." << std::endl;
                    
            throw wsa_startup_err;
                }
            }

            WinsockAPI::
            ~WinsockAPI()
            {
                WSACleanup();
            }

            void WinsockAPI::showVersion() const
            {
                std::cout    
            << "The version of Winsock.dll is " 
                            
            << int(LOBYTE(wsaData.wVersion)) 
                            
            << "." 
                            
            << int(HIBYTE(wsaData.wVersion)) 
                            
            << "." 
                            
            << std::endl;
                
            return;
            }

            //class BaseSock

            BaseSock::BaseSock():
            sockFD(
            -1)
            {}

            BaseSock::
            ~BaseSock()
            {}

            const int& BaseSock::showSockFD() const
            {
                
            return sockFD;
            }

            //class TCPListenSock

            TCPListenSock::TCPListenSock(unsigned 
            short listen_port)
            {
                sockFD 
            = socket(PF_INET,
                                SOCK_STREAM,
                                IPPROTO_TCP);
                
            if (sockFD < 0) {
                    sockClass::error_info(
            "socket() failed.");
                }
                memset(
            &listenSockAddr, 0sizeof(listenSockAddr));
                listenSockAddr.sin_family 
            = AF_INET;
                listenSockAddr.sin_addr.s_addr 
            = htonl(INADDR_ANY);
                listenSockAddr.sin_port 
            = htons(listen_port);
                
            if (bind(    sockFD,
                            (sockaddr
            *)&listenSockAddr,
                            
            sizeof(listenSockAddr)) < 0) {
                    sockClass::error_info(
            "bind() failed.");
                }
            }

            TCPListenSock::
            ~TCPListenSock()
            {
                closesocket(sockFD);
            }

            void TCPListenSock::TCPListen(
                                    
            int max_connection_requests) const
            {
                
            if (listen(    sockFD,
                            max_connection_requests) 
            < 0) {
                    sockClass::error_info(
            "listen() failed.");
                }
            }

            //class TCPServerSock

            TCPServerSock::TCPServerSock(
                            
            const TCPListenSock& listen_sock,
                            
            int pre_buffer_size):
            preBufferSize(pre_buffer_size),
            preReceivedLength(
            0)
            {
                preBuffer 
            = new char[preBufferSize];

                
            int clientSockAddrLen = sizeof(clientSockAddr);
                sockFD 
            = accept(    listen_sock.showSockFD(),
                                    (sockaddr
            *)&clientSockAddr,
                                    
            &clientSockAddrLen);
                
            if (sockFD < 0) {
                    sockClass::error_info(
            "accept() failed.");
                }
                std::cout    
            << "Client (IP: "
                            
            << inet_ntoa(clientSockAddr.sin_addr)
                            
            << ") conneted." << std::endl;
            }

            TCPServerSock::
            ~TCPServerSock()
            {
                delete [] preBuffer;
                closesocket(sockFD);
            }

            int TCPServerSock::TCPReceive() const
            {
                preReceivedLength 
            = recv(    sockFD,
                                            preBuffer,
                                            preBufferSize,
                                            
            0);
                
            if (preReceivedLength < 0) {
                    sockClass::error_info(
            "recv() failed.");
                } 
            else if (preReceivedLength == 0) {
                    std::cout 
            << "Client has been disconnected.\n";
                    
            return 0;
                }
                
            return preReceivedLength;
            }

            int TCPServerSock::TCPSend(const char* send_data,
                                       
            const int& data_length) const
            {
                
            if (data_length > preBufferSize) {
                    
            throw "Data is too large, resize preBufferSize.";
                }

                
            int sent_length = send(    sockFD,
                                        send_data,
                                        data_length,
                                        
            0);
                
            if (sent_length < 0) {
                    sockClass::error_info(
            "send() failed.");
                } 
            else if (sent_length != data_length) {
                    sockClass::error_info(
            "sent unexpected number of bytes.");
                }

                
            return sent_length;
            }

            //Filename AppSock.hpp

            #ifndef APP_SOCK_HPP
            #define APP_SOCK_HPP

            #include 
            "SockClass.hpp"

            class TCPEchoServer: public TCPServerSock{
            public:
                TCPEchoServer(
                    
            const TCPListenSock& listen_sock,
                    
            int pre_buffer_size = 32);
                
            ~TCPEchoServer();
                
            bool handEcho() const;
            };

            #endif //AppSock.hpp

            //Filename: AppSock.cpp

            #include 
            <string>
            #include 
            "AppSock.hpp"

            TCPEchoServer::TCPEchoServer(
            const TCPListenSock& listen_sock, int pre_buffer_size):
            TCPServerSock(listen_sock, pre_buffer_size)
            {}

            TCPEchoServer::
            ~TCPEchoServer()
            {}

            bool TCPEchoServer::handEcho() const
            {
                
            const std::string SHUTDOWN_CMD = "/shutdown";
                
            while (TCPReceive() > 0) {
                    std::
            string cmd(preBuffer, SHUTDOWN_CMD.size());
                    
            if (cmd == SHUTDOWN_CMD && preReceivedLength == SHUTDOWN_CMD.size()) {
                        
            return false;
                    }
                    TCPSend(preBuffer, preReceivedLength);
                }
                
            return true;
            }

            //Filename: main.cpp

            #include 
            "SockClass.hpp"
            #include 
            "AppSock.hpp"

            int TCP_echo_server(int argc, char* argv[]);

            int main(int argc, char* argv[])
            {
                
            int mainRtn = 0;
                
            try {
                    mainRtn 
            =TCP_echo_server(argc, argv);
                }
                
            catch (const char* s) {
                    perror(s);
                    
            return 1;
                }
                
            catch (const int& err) {
                    std::cerr 
            << "Error: " << err << std::endl;
                    
            return 1;
                }

                
            return mainRtn;
            }

            int TCP_echo_server(int argc, char* argv[])
            {
                
            const unsigned short DEFAULT_PORT = 5000;
                unsigned 
            short listen_port = DEFAULT_PORT;
                
            if (argc == 2 && atoi(argv[1]) > 0) {
                    listen_port 
            = atoi(argv[1]);
                }

                WinsockAPI winsockInfo;
                winsockInfo.showVersion();

                TCPListenSock listen_sock(listen_port);
                listen_sock.TCPListen();

                
            bool go_on = true;
                
            while (go_on){
                    TCPEchoServer echo_server(listen_sock);
                    go_on 
            = echo_server.handEcho();
                }

                
            return 0;
            }
            posted on 2010-06-03 10:45 lf426 閱讀(1889) 評論(2)  編輯 收藏 引用 所屬分類: SDL入門教程socket 編程入門教程

            FeedBack:
            # re: socket 編程入門教程(二)winsock演示程序:TCP Server 2010-10-16 21:21 莉薩
            為什么要有一個TCPEchoServerSock類呢.

            ListenSock和TCPServerSock就能完成任務了阿,從職責上說,EchoServer只是多了個發送指令的任務,不應該繼承EchoServer吧.

            用一個獨立Echo類,引用一個const TCPServerSock對象,是不是更妥當呢?

            入門教程(2)沒有入門教程(1)那么耐心仔細了呢...樓主加油.  回復  更多評論
              
            # re: socket 編程入門教程(二)winsock演示程序:TCP Server 2010-10-16 21:21 莉薩
            我上面第二句說錯了,EchoServer不應該繼承ServerSock  回復  更多評論
              
            久久综合九色欧美综合狠狠| 久久综合中文字幕| 久久久www免费人成精品| 久久久久亚洲AV无码专区首JN| 欧美日韩精品久久久免费观看| 久久婷婷国产综合精品| 成人综合伊人五月婷久久| 久久精品国产黑森林| 久久久精品人妻一区二区三区蜜桃| 日韩精品久久久久久久电影蜜臀| 99久久99久久| 99精品久久久久久久婷婷| 亚洲欧美精品伊人久久| 久久久久久精品免费看SSS| 999久久久国产精品| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久精品免费国产四虎| 精品久久久久久久久久久久久久久 | 欧美亚洲色综久久精品国产 | 性高朝久久久久久久久久| 亚洲国产精品无码久久SM| 久久精品99无色码中文字幕| 国产精品视频久久| 亚洲午夜久久久久妓女影院| 欧美国产成人久久精品| 久久亚洲高清观看| 久久国产精品99精品国产| 久久久久久曰本AV免费免费| 99久久人人爽亚洲精品美女 | 一级做a爰片久久毛片16| 久久久一本精品99久久精品88| 久久久久人妻一区精品| 91久久精品电影| 久久九九亚洲精品| 久久美女人爽女人爽| 久久综合久久综合久久综合| 精品综合久久久久久97超人| 国产美女久久精品香蕉69| 无码AV波多野结衣久久| 亚洲色欲久久久综合网东京热| 中文字幕久久精品无码|