• <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
            <2008年9月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492138
            • 排名 - 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  回復  更多評論
              
            无码8090精品久久一区 | 中文字幕人妻色偷偷久久| 色播久久人人爽人人爽人人片aV| 久久人人爽人人爽人人片AV麻豆 | 狠狠88综合久久久久综合网| 国产一区二区三区久久| 久久久精品久久久久特色影视| 国产成人综合久久精品红| 久久精品蜜芽亚洲国产AV| 国产成人精品久久综合| 国产精品乱码久久久久久软件| 色婷婷综合久久久中文字幕| 国产免费久久精品99久久| 精品久久久久久中文字幕大豆网| 久久精品这里热有精品| 亚洲精品tv久久久久| 91久久精品无码一区二区毛片| 久久精品国产男包| 久久久久亚洲精品天堂久久久久久 | …久久精品99久久香蕉国产| 香蕉久久永久视频| 亚洲国产精品久久久久婷婷老年| 久久久亚洲裙底偷窥综合| 久久艹国产| 国产精品久久久久乳精品爆| av无码久久久久久不卡网站| 久久人人爽人人爽人人片AV东京热| 99久久免费国产精品| 国产成人久久精品区一区二区| 中文精品久久久久人妻不卡| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 99久久精品午夜一区二区 | 欧洲成人午夜精品无码区久久| 久久精品这里只有精99品| 国产精品亚洲美女久久久| 婷婷综合久久中文字幕| 久久99国产精一区二区三区| 国产精品久久久久久久| 韩国三级大全久久网站| 色成年激情久久综合| 99久久国产亚洲高清观看2024|