摘要:采用以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;
}