青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 96  文章 - 255  trackbacks - 0
<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

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

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

SDL相關網站

我的個人網頁

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 495368
  • 排名 - 39

最新評論

閱讀排行榜

評論排行榜

//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 閱讀(1914) 評論(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  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              黄色精品网站| 性xx色xx综合久久久xx| 欧美一二三区在线观看| 亚洲视频一区| av成人天堂| 亚洲一区二区三区四区视频| 亚洲专区一二三| 久久精品视频在线播放| 免费视频亚洲| 亚洲乱码视频| 亚洲欧美国产日韩中文字幕| 欧美在线看片| 美女精品视频一区| 欧美日韩亚洲一区二区三区在线 | 欧美激情bt| 欧美三级日本三级少妇99| 国产欧美va欧美不卡在线| 精品成人一区| 中日韩在线视频| 久久视频一区二区| 亚洲伦理久久| 美女网站久久| 国产精品美女久久久浪潮软件| 狠狠色噜噜狠狠色综合久| 亚洲免费av网站| 久久美女性网| 中文网丁香综合网| 美国成人直播| 国产乱码精品一区二区三区不卡| 在线观看欧美日韩| 午夜在线不卡| 亚洲麻豆视频| 免费在线日韩av| 国产综合一区二区| 亚洲欧美日韩直播| 亚洲国产综合91精品麻豆| 99热免费精品| 免费永久网站黄欧美| 国产精品日韩专区| 一区二区日韩免费看| 免费看亚洲片| 久久国产精品网站| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲国产精品悠悠久久琪琪| 久久国产精品一区二区| 宅男精品导航| 欧美日本亚洲韩国国产| 亚洲欧洲精品一区二区三区| 久久婷婷蜜乳一本欲蜜臀| 亚洲男女毛片无遮挡| 欧美性久久久| 在线一区观看| 亚洲视频观看| 欧美激情久久久久| 亚洲全黄一级网站| 欧美寡妇偷汉性猛交| 欧美中文字幕在线视频| 国产嫩草影院久久久久| 中文网丁香综合网| 亚洲精品在线看| 欧美日韩国内自拍| 夜夜嗨av一区二区三区网页| 亚洲精品国产精品乱码不99| 欧美国产日韩免费| 亚洲精品在线观| 亚洲欧洲精品一区二区三区 | 亚洲高清网站| 欧美成人在线网站| 亚洲国产婷婷| 最新日韩中文字幕| 国产精品二区在线观看| 午夜视频一区| 欧美综合国产精品久久丁香| 黄色亚洲精品| 亚洲欧洲综合| 国产精品人人爽人人做我的可爱 | 国产一区二区三区高清在线观看| 香港久久久电影| 欧美中文字幕视频在线观看| 国产在线播放一区二区三区| 久热精品视频在线免费观看| 久久综合中文| 一本一本久久a久久精品牛牛影视| 日韩一级精品| 国产亚洲福利社区一区| 欧美成人激情视频| 欧美视频观看一区| 久久蜜桃资源一区二区老牛| 欧美激情1区2区| 久久精品道一区二区三区| 久久亚洲精选| 日韩一级精品视频在线观看| 亚洲欧美日韩精品在线| 在线成人免费观看| 亚洲精品中文字幕女同| 国产日韩精品电影| 亚洲国产合集| 国产亚洲精品福利| 亚洲日本中文字幕| 国产亚洲美州欧州综合国| 91久久久久久| 狠狠综合久久av一区二区老牛| 亚洲国产日韩欧美在线99| 国产精品亚洲综合色区韩国| 亚洲电影有码| 国产一区二区你懂的| 久久狠狠亚洲综合| 亚洲国产日韩精品| 国产亚洲二区| 亚洲免费福利视频| 在线成人激情| 欧美在线亚洲综合一区| 一区二区三区视频在线| 久久国产精品久久久久久电车| 亚洲宅男天堂在线观看无病毒| 久久综合影音| 老司机67194精品线观看| 国产精品久久久久久模特 | 亚洲免费在线播放| 99精品视频免费观看视频| 久久精品国产清自在天天线| 午夜久久资源| 国产精品成人免费| 91久久精品日日躁夜夜躁国产| 在线不卡欧美| 久久男人av资源网站| 久久九九有精品国产23| 国产精品亚洲视频| 亚洲综合日韩| 午夜精品一区二区三区在线播放| 欧美美女bb生活片| 亚洲欧洲日产国产网站| 亚洲精品国产无天堂网2021| 久久久精品动漫| 久久免费观看视频| 伊人久久亚洲影院| 久久久在线视频| 免费成人毛片| 亚洲国产精品一区二区第四页av| 久久午夜av| 亚洲国产精品成人综合色在线婷婷 | 国外成人在线| 久久久精品久久久久| 六月丁香综合| 亚洲国产一区视频| 欧美国产日韩一区二区在线观看| 亚洲国产精品va| 这里只有精品电影| 国产精品久久久久9999吃药| 亚洲欧美日韩区| 蜜桃伊人久久| 亚洲日韩第九十九页| 欧美日韩福利| 亚洲欧美日韩国产一区二区三区 | 99热精品在线| 欧美日韩亚洲成人| 午夜国产精品视频免费体验区| 久久精品久久综合| 亚洲第一精品久久忘忧草社区| 嫩草成人www欧美| 日韩视频免费观看高清在线视频| 亚洲男女自偷自拍| 国产一级久久| 欧美国产高清| 亚洲永久字幕| 免费在线看成人av| 在线中文字幕一区| 国产日产亚洲精品| 欧美国产日本高清在线| 亚洲尤物影院| 欧美肉体xxxx裸体137大胆| 乱码第一页成人| 99在线热播精品免费99热| 国产精品免费区二区三区观看| 久久国产欧美| 亚洲精品国产品国语在线app | 亚洲二区三区四区| 亚洲一区中文字幕在线观看| 国产亚洲精品久久久久久| 欧美激情一区| 久久精品首页| 一区二区三区四区国产| 久热国产精品| 午夜精品一区二区在线观看| 亚洲人成艺术| 黄色精品一区| 国产裸体写真av一区二区| 欧美精品国产一区| 久久久久久穴| 午夜精品久久久久久久久久久久久 | 亚洲私拍自拍| 尹人成人综合网| 国产精品亚洲精品| 欧美日本一道本在线视频| 另类天堂视频在线观看| 欧美在线日韩在线| 亚洲自拍三区| 999在线观看精品免费不卡网站| 免费久久精品视频| 卡通动漫国产精品|