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

来源:互联网 发布:英雄无敌3括号数据 编辑:程序博客网 时间:2024/06/06 03:41

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

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
原创粉丝点击