Windows 采用Socket方式实现服务器和客户端的数据访问

摘要:采用以CAsyncSocket为基类的服务器Socket接口类,实现服务器和客户端的数据访问。

百度百科关于CAsyncSocket的用法:https://baike.baidu.com/item/CAsyncSocket/9597393?fr=aladdin

详细介绍:https://wenku.baidu.com/view/1eda781c6bd97f192279e9de.html

Sever端:

#pragma once
// CListenSocket 命令目标

class CListenSocket : public CAsyncSocket
{
public:
    CListenSocket();
    virtual ~CListenSocket();

    void OnReceive(int nErrorCode);
    void OnSend(int nErrorCode);
    void OnAccept(int nErrorCode);
    void OnClose(int nErrorCode);
};

// ListenSocket.cpp : 实现文件
//
#include "stdafx.h"
#include "Server.h"
#include "ListenSocket.h"

// CListenSocket
CListenSocket::CListenSocket(){}


CListenSocket::~CListenSocket(){}


void CListenSocket::OnReceive(int nErrorCode)
{
    char buf[255]; 
    int length;
    length = Receive(buf,sizeof(buf));
    if (length <= 0)
    {
        nErrorCode = WSAGetLastError();
        return;
    }

    if (buf[0] == 'g')
    {
        //GetPeerName()
    }
    else if(buf[0] = 's')
    {
        char sendbuf[] = "I LOVE YOU";
        Send(sendbuf,sizeof(sendbuf));
    }
    
}

void CListenSocket::OnSend(int nErrorCode)
{
   __super::OnSend(nErrorCode);
}

void CListenSocket::OnAccept(int nErrorCode)
{
    CListenSocket *pListenSocket = new CListenSocket;
    CString strTemp;
    if (Accept(*pListenSocket))
    {
        struct sockaddr_in peeraddr;
        socklen_t len;
        int ret = pListenSocket->GetPeerName((struct sockaddr *)&peeraddr, &len);
        strTemp.Format(_T("Port:%d"),peeraddr.sin_port);
        /*RichEditAddLine(strTemp);*/
    }
    else
    {
        nErrorCode = GetLastError();
        strTemp.Format(_T("Error Code:%d"),nErrorCode);
        /*RichEditAddLine(strTemp,RGB(255,0,0));*/
    }
}

void CListenSocket::OnClose(int nErrorCode)
{
    __super::OnClose(nErrorCode);
}
// CListenSocket 成员函数




Client端:

#pragma once
class CEasySocket
{
public:
    CEasySocket(void);
    ~CEasySocket(void);

    bool Connect(const char*addr,UINT port);
    bool SendAndRecvData(const CString& strSendBuf,CString& strRecvBuf,bool Status = false,int millsec = 3000);
private:
    SOCKET m_sock;
};

#include "StdAfx.h"
#include "EasySocket.h"

CEasySocket::CEasySocket(void)
{
    m_sock = socket(AF_INET,SOCK_STREAM,0);
}

CEasySocket::~CEasySocket(void)
{
    closesocket(m_sock);
}

bool CEasySocket::Connect(const char*addr,UINT port)
{
    SOCKADDR_IN addr_in;
    addr_in.sin_family = AF_INET;
    addr_in.sin_addr.s_addr = inet_addr(addr);
    addr_in.sin_port = htons(port);
    int ret = ::connect(m_sock,(struct sockaddr*)&addr_in,sizeof(struct sockaddr));
    return ret == 0;
}

bool CEasySocket::SendAndRecvData(const CString& strSendBuf,CString& strRecvBuf,bool Status /* = false */,int millsec /* = 3000 */)
{
    if (strSendBuf.IsEmpty())return false;

    int length = strSendBuf.GetLength();
    char sendbuf[255];
    sprintf(sendbuf,"s %s",strSendBuf);
    int len = ::send(m_sock,sendbuf,length,0);
    char recvBuf[255];
    if (len == length)
    { 
        ::recv(m_sock,recvBuf,sizeof(recvBuf),0);
        Sleep(millsec);
    }
    strRecvBuf  = recvBuf;
    return true;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值