牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

Windows 下的最简单的TCP服务器客户端

他们是短连接的,服务器接受客户端之后,马上发送一个消息,发送完以后立即将客户端断开掉,然后继续等待下一个连接.


使用Winsocket2必须要引用到的头文件和需要包含到的链接库文件:

#include <WinSock2.h>
#pragma comment( lib, 
"ws2_32.lib" )



以下代码是Winsocket2的系统初始化和关闭的封装代码.

class WinSocketSystem
{
public:
    WinSocketSystem()
    
{
        
int iResult = WSAStartup( MAKEWORD( 22 ), &wsaData );
        
if (iResult != NO_ERROR)
        
{
            exit(
-1);
        }

    }


    
~WinSocketSystem()
    
{
        WSACleanup();
    }


protected:
    WSADATA wsaData;
}
;

static WinSocketSystem g_winsocketsystem;


服务器端代码:
class TCPServer
{
public:
    TCPServer()
        : mServerSocket(INVALID_SOCKET)
    
{
        
// 创建套接字
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
        
if (mServerSocket == INVALID_SOCKET)
        
{
            std::cout 
<< "创建套接字失败!" << std::endl;
            
return;
        }


        
// 填充服务器的IP和端口号
        mServerAddr.sin_family        = AF_INET;
        mServerAddr.sin_addr.s_addr    
= INADDR_ANY;
        mServerAddr.sin_port        
= htons((u_short)SERVER_PORT);

        
// 绑定IP和端口
        if ( ::bind(mServerSocket, (sockaddr*)&mServerAddr, sizeof(mServerAddr)) == SOCKET_ERROR)
        
{
            std::cout 
<< "绑定IP和端口失败!" << std::endl;
            
return;
        }


        
// 监听客户端请求,最大同时连接数设置为10.
        if ( ::listen(mServerSocket, SOMAXCONN) == SOCKET_ERROR)
        
{
            std::cout 
<< "监听端口失败!" << std::endl;
            
return;
        }


        std::cout 
<< "启动TCP服务器成功!" << std::endl;
    }


    
~TCPServer()
    
{
        ::closesocket(mServerSocket);
        std::cout 
<< "关闭TCP服务器成功!" << std::endl;
    }


    
void run()
    
{
        
int nAcceptAddrLen = sizeof(mAcceptAddr);
        
for (;;)
        
{
            
// 以阻塞方式,等待接收客户端连接
            mAcceptSocket = ::accept(mServerSocket, (struct sockaddr*)&mAcceptAddr, &nAcceptAddrLen);
            std::cout 
<< "接受客户端IP:" << inet_ntoa(mAcceptAddr.sin_addr) << std::endl;

            
// 发送消息
            int ret = ::send(mAcceptSocket, SEND_STRING, (int)strlen(SEND_STRING), 0);
            
if (ret != 0)
            
{
                std::cout 
<< "发送消息成功!" << std::endl;
            }


            
// 关闭客户端套接字
            ::closesocket(mAcceptSocket);
            std::cout 
<< "断开客户端端成功!" << std::endl;
        }

    }


private:
    SOCKET        mServerSocket;    
///< 服务器套接字句柄
    sockaddr_in    mServerAddr;    ///< 服务器地址

    SOCKET        mAcceptSocket;    ///< 接受的客户端套接字句柄
    sockaddr_in    mAcceptAddr;    ///< 接收的客户端地址
};


int _tmain(int argc, _TCHAR* argv[])
{
    TCPServer server;
    server.run();

    
return 0;
}


客户端代码:
class TCPClient
{
public:
    TCPClient()
    
{
        
// 创建套接字
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
        
if (mServerSocket == INVALID_SOCKET)
        
{
            std::cout 
<< "创建套接字失败!" << std::endl;
            
return;
        }


        
// 填充服务器的IP和端口号
        mServerAddr.sin_family        = AF_INET;
        mServerAddr.sin_addr.s_addr    
= inet_addr(SERVER_IP);
        mServerAddr.sin_port        
= htons((u_short)SERVER_PORT);

        
// 连接到服务器
        if ( ::connect(mServerSocket, (struct sockaddr*)&mServerAddr, sizeof(mServerAddr)))
        
{
            ::closesocket(mServerSocket);
            std::cout 
<< "连接服务器失败!" << std::endl;
            
return;    
        }

    }


    
~TCPClient()
    
{
        ::closesocket(mServerSocket);
    }


    
void run()
    
{
        
int nRecvSize = 0;
        
char buff[BUFFER_SIZE];
        memset(buff, 
0sizeof(buff) );
        
while (nRecvSize = ::recv(mServerSocket, buff, BUFFER_SIZE, 0) )
        
{
            
if (mServerSocket == INVALID_SOCKET)
            
{                
                
break;
            }


            std::cout 
<< buff << std::endl;
        }


        std::cout 
<< "已经和服务器断开连接!" << std::endl;
    }


private:
    SOCKET        mServerSocket;    
///< 服务器套接字句柄
    sockaddr_in    mServerAddr;    ///< 服务器地址
};



int _tmain(int argc, _TCHAR* argv[])
{
    TCPClient client;
    client.run();

    system(
"pause");
    
return 0;
}



源代码下载:
服务器端代码: testTCPServer.rar
客户端代码: testTCPClient.rar

posted on 2010-06-10 21:57 杨粼波 阅读(6319) 评论(4)  编辑 收藏 引用 所属分类: 原创文章网络编程

评论

# re: Windows 下的最简单的TCP服务器客户端 2010-06-10 23:45 EaiLFly

太谢谢了,我刚好要写个TCP的课程设计,参考一下  回复  更多评论   

# re: Windows 下的最简单的TCP服务器客户端 2010-06-10 23:48 杨粼波

我这里还有一个Linux的简单TCP服务器客户端:
http://www.cppblog.com/tx7do/articles/5966.html  回复  更多评论   

# re: Windows 下的最简单的TCP服务器客户端 2010-06-11 09:51 zuhd

发这个代码?你想干嘛呢?最近很活跃啊  回复  更多评论   

# re: Windows 下的最简单的TCP服务器客户端[未登录] 2010-06-11 19:43 杨粼波

我闲的发慌,哈哈哈.....  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理