博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows 下的最简单的TCP服务器客户端
阅读量:6693 次
发布时间:2019-06-25

本文共 3002 字,大约阅读时间需要 10 分钟。

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

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

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

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

None.gif
class WinSocketSystem
ExpandedBlockStart.gif {
InBlock.gif
public:
InBlock.gif    WinSocketSystem()
ExpandedSubBlockStart.gif    {
InBlock.gif        
int iResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
InBlock.gif        
if (iResult != NO_ERROR)
ExpandedSubBlockStart.gif        {
InBlock.gif            exit(-1);
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    ~WinSocketSystem()
ExpandedSubBlockStart.gif    {
InBlock.gif        WSACleanup();
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif
protected:
InBlock.gif    WSADATA wsaData;
ExpandedBlockEnd.gif};
None.gif
None.gif
static WinSocketSystem g_winsocketsystem;


服务器端代码:

None.gif
class TCPServer
ExpandedBlockStart.gif {
InBlock.gif
public:
InBlock.gif    TCPServer()
InBlock.gif        : mServerSocket(INVALID_SOCKET)
ExpandedSubBlockStart.gif    {
InBlock.gif        
//
 创建套接字
InBlock.gif
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
InBlock.gif        
if (mServerSocket == INVALID_SOCKET)
ExpandedSubBlockStart.gif        {
InBlock.gif            std::cout << "创建套接字失败!" << std::endl;
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
//
 填充服务器的IP和端口号
InBlock.gif
        mServerAddr.sin_family        = AF_INET;
InBlock.gif        mServerAddr.sin_addr.s_addr    = INADDR_ANY;
InBlock.gif        mServerAddr.sin_port        = htons((u_short)SERVER_PORT);
InBlock.gif
InBlock.gif        
//
 绑定IP和端口
InBlock.gif
        
if ( ::bind(mServerSocket, (sockaddr*)&mServerAddr, 
sizeof(mServerAddr)) == SOCKET_ERROR)
ExpandedSubBlockStart.gif        {
InBlock.gif            std::cout << "绑定IP和端口失败!" << std::endl;
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
//
 监听客户端请求,最大同时连接数设置为10.
InBlock.gif
        
if ( ::listen(mServerSocket, SOMAXCONN) == SOCKET_ERROR)
ExpandedSubBlockStart.gif        {
InBlock.gif            std::cout << "监听端口失败!" << std::endl;
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        std::cout << "启动TCP服务器成功!" << std::endl;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    ~TCPServer()
ExpandedSubBlockStart.gif    {
InBlock.gif        ::closesocket(mServerSocket);
InBlock.gif        std::cout << "关闭TCP服务器成功!" << std::endl;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
void run()
ExpandedSubBlockStart.gif    {
InBlock.gif        
int nAcceptAddrLen = 
sizeof(mAcceptAddr);
InBlock.gif        
for (;;)
ExpandedSubBlockStart.gif        {
InBlock.gif            
//
 以阻塞方式,等待接收客户端连接
InBlock.gif
            mAcceptSocket = ::accept(mServerSocket, (
struct sockaddr*)&mAcceptAddr, &nAcceptAddrLen);
InBlock.gif            std::cout << "接受客户端IP:" << inet_ntoa(mAcceptAddr.sin_addr) << std::endl;
InBlock.gif
InBlock.gif            
//
 发送消息
InBlock.gif
            
int ret = ::send(mAcceptSocket, SEND_STRING, (
int)strlen(SEND_STRING), 0);
InBlock.gif            
if (ret != 0)
ExpandedSubBlockStart.gif            {
InBlock.gif                std::cout << "发送消息成功!" << std::endl;
ExpandedSubBlockEnd.gif            }
InBlock.gif
InBlock.gif            
//
 关闭客户端套接字
InBlock.gif
            ::closesocket(mAcceptSocket);
InBlock.gif            std::cout << "断开客户端端成功!" << std::endl;
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif
private:
ExpandedSubBlockStart.gif    SOCKET        mServerSocket;    
///
< 服务器套接字句柄
InBlock.gif
    sockaddr_in    mServerAddr;    
///
< 服务器地址
ExpandedSubBlockEnd.gif
ExpandedSubBlockStart.gif    SOCKET        mAcceptSocket;    
///
< 接受的客户端套接字句柄
InBlock.gif
    sockaddr_in    mAcceptAddr;    
///
< 接收的客户端地址
ExpandedSubBlockEnd.gif
};
InBlock.gif
InBlock.gif
int _tmain(
int argc, _TCHAR* argv[])
ExpandedSubBlockStart.gif{
InBlock.gif    TCPServer server;
InBlock.gif    server.run();
InBlock.gif
InBlock.gif    
return 0;
ExpandedSubBlockEnd.gif}


客户端代码:

None.gif
class TCPClient
ExpandedBlockStart.gif {
InBlock.gif
public:
InBlock.gif    TCPClient()
ExpandedSubBlockStart.gif    {
InBlock.gif        
//
 创建套接字
InBlock.gif
        mServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
InBlock.gif        
if (mServerSocket == INVALID_SOCKET)
ExpandedSubBlockStart.gif        {
InBlock.gif            std::cout << "创建套接字失败!" << std::endl;
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        
//
 填充服务器的IP和端口号
InBlock.gif
        mServerAddr.sin_family        = AF_INET;
InBlock.gif        mServerAddr.sin_addr.s_addr    = inet_addr(SERVER_IP);
InBlock.gif        mServerAddr.sin_port        = htons((u_short)SERVER_PORT);
InBlock.gif
InBlock.gif        
//
 连接到服务器
InBlock.gif
        
if ( ::connect(mServerSocket, (
struct sockaddr*)&mServerAddr, 
sizeof(mServerAddr)))
ExpandedSubBlockStart.gif        {
InBlock.gif            ::closesocket(mServerSocket);
InBlock.gif            std::cout << "连接服务器失败!" << std::endl;
InBlock.gif            
return;    
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    ~TCPClient()
ExpandedSubBlockStart.gif    {
InBlock.gif        ::closesocket(mServerSocket);
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif    
void run()
ExpandedSubBlockStart.gif    {
InBlock.gif        
int nRecvSize = 0;
InBlock.gif        
char buff[BUFFER_SIZE];
InBlock.gif        memset(buff, 0, 
sizeof(buff) );
InBlock.gif        
while (nRecvSize = ::recv(mServerSocket, buff, BUFFER_SIZE, 0) )
ExpandedSubBlockStart.gif        {
InBlock.gif            
if (mServerSocket == INVALID_SOCKET)
ExpandedSubBlockStart.gif            {                
InBlock.gif                
break;
ExpandedSubBlockEnd.gif            }
InBlock.gif
InBlock.gif            std::cout << buff << std::endl;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        std::cout << "已经和服务器断开连接!" << std::endl;
ExpandedSubBlockEnd.gif    }
InBlock.gif
InBlock.gif
private:
ExpandedSubBlockStart.gif    SOCKET        mServerSocket;    
///
< 服务器套接字句柄
InBlock.gif
    sockaddr_in    mServerAddr;    
///
< 服务器地址
ExpandedSubBlockEnd.gif
};
InBlock.gif
InBlock.gif
InBlock.gif
int _tmain(
int argc, _TCHAR* argv[])
ExpandedSubBlockStart.gif{
InBlock.gif    TCPClient client;
InBlock.gif    client.run();
InBlock.gif
InBlock.gif    system("pause");
InBlock.gif    
return 0;
ExpandedSubBlockEnd.gif}
InBlock.gif

转载地址:http://rajoo.baihongyu.com/

你可能感兴趣的文章
applicationContext.txt
查看>>
前端相关汇总
查看>>
JuliaBox:一个对小白友好的在线 Jupyter Notebook 编辑器 :)
查看>>
我的前端那些事 --less进阶
查看>>
javascript之cookie, localstorage, sessionstorge
查看>>
面试总结1
查看>>
Python pymysql数据库之建库建表、增删改查
查看>>
webpack打包多页面的方式
查看>>
DOM元素动态监控
查看>>
如何学习游戏开发?游戏开发如何入门?Unity3D好学吗?怎么学习,学习路线是什么?...
查看>>
SpringBoot实战历程视频教程横空出世啦!
查看>>
Linux常用命令 — 压缩解压gzip、gunzip、tar
查看>>
JDK中的动态代理机制
查看>>
2018/12/29
查看>>
React 之HOOK 概述
查看>>
关于Android进程知识,你需要知道这些(一)
查看>>
[译] 使用 Python 进行自动化特征工程
查看>>
Java封装
查看>>
前端小白也能快速学会的博客园博客美化全攻略[附源码]
查看>>
js数组、字符串方法
查看>>