c++向mysql通信_[转载]C++ 简单封装socket类包含TCP和UDP基本通信能力

// TSocket.cpp: implementation of the TSocket class.

//

//

#include "stdafx.h"

#include "TSocket.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//

// Construction/Destruction

//

TSocket::TSocket()

{

m_bMode = FALSE;//UDP

m_ulRemoteIP = 0;

m_ulLocalIP = 0;

}

TSocket::~TSocket()

{

//释放Winsock库

WSACleanup();

}

BOOL TSocket::LoadSocket()

{

//加载Winsock库

WSADATA wsa;

if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)

{

return FALSE;  //加载失败

}

return TRUE;

}

BOOL TSocket::CreateSocketSer(BOOL bMode)

{

m_bMode = bMode;

//创建SOCKET

if (m_bMode)

{

m_socket = socket(AF_INET,SOCK_STREAM,0);//TCP流式

}else

{

m_socket = socket(AF_INET,SOCK_DGRAM,0);//UDP方式

}

return TRUE;

}

SOCKET TSocket::CreateSocket( BOOL bMode )

{

m_bMode = bMode;

SOCKET socketCr;

//创建SOCKET

if (m_bMode)

{

socketCr = socket(AF_INET,SOCK_STREAM,0);//TCP方式

}else

{

socketCr = socket(AF_INET,SOCK_DGRAM,0);//UDP方式

}

return socketCr;

}

BOOL TSocket::BingSocket(u_long ulIP,u_short usPort)

{

//配置监听地址、绑定监听端口

SOCKADDR_IN Sersock;//用于服务器的监听SOCKET

ZeroMemory(&Sersock,sizeof(Sersock));

if(ulIP==0)

{

Sersock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

}else

{

Sersock.sin_addr.S_un.S_addr = htonl(ulIP);//IP

}

Sersock.sin_family = AF_INET;

Sersock.sin_port = htons(usPort);//端口号

int nbind = bind(m_socket,(SOCKADDR

*)&Sersock,sizeof(SOCKADDR));

if (SOCKET_ERROR==nbind)

{

closesocket(m_socket);

return FALSE;

}

return TRUE;

}

DWORD WINAPI TSocket::TcpRecvProc( LPVOID lpParameter )

{

TSocket* psocket = ((RECVPARAM

*)lpParameter)->psocket;

HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;

delete lpParameter;//释放内存

listen(psocket->m_socket,5);

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

char szrecvbuf[MAX_MSG_LEN];

char szsendBuf[50];

ZeroMemory(szrecvbuf,sizeof(szrecvbuf));

ZeroMemory(szsendBuf,sizeof(szsendBuf));

SOCKET sockSer;

while(psocket->m_bIsRun)

{

//用accept函数接收客户方的连接

sockSer=accept(psocket->m_socket,(SOCKADDR*)&addrClient,&len);

if (INVALID_SOCKET==sockSer)

continue;

sprintf(szsendBuf,"Welcome %s to

here!",inet_ntoa(addrClient.sin_addr));

//在客户方套接字clientSocket上使用send发送数据

send(sockSer,szsendBuf,strlen(szsendBuf)+1,0);

//接收的数据

recv(sockSer,szrecvbuf,50,0);

psocket->m_strData.Format(_T("IP:%s,端口:%d 说:%s"),

inet_ntoa(addrClient.sin_addr),addrClient.sin_port,szrecvbuf);

::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0));

//关闭本次连接

closesocket(sockSer);

//休息100S

Sleep(100);

}

//关闭socket

closesocket(psocket->m_socket);

return 0;

}

DWORD WINAPI TSocket::UdpRecvProc( LPVOID lpParameter )

{

TSocket* psocket = ((RECVPARAM

*)lpParameter)->psocket;

HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;

delete lpParameter;//释放内存

SOCKADDR_IN sockRecv;

int nlen = sizeof(SOCKADDR);

char szrecvbuf[MAX_MSG_LEN];

ZeroMemory(szrecvbuf,sizeof(szrecvbuf));

int nrecv;

while (psocket->m_bIsRun)

{

nrecv=recvfrom(psocket->m_socket,szrecvbuf,sizeof(szrecvbuf),0,(SOCKADDR

*)&sockRecv,&nlen);

if (SOCKET_ERROR == nrecv)

break;

psocket->m_strData.Format(_T("IP:%s,端口:%d 说:%s"),

inet_ntoa(sockRecv.sin_addr),sockRecv.sin_port,szrecvbuf);

::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0));

//休息100S

Sleep(1000);

}

//关闭socket

closesocket(psocket->m_socket);

CloseHandle(psocket->m_hRecv);

return 0;

}

BOOL TSocket::Start( RECVPARAM* recvPar )

{

m_bIsRun = TRUE;

//创建接收消息的线程

if (m_bMode)

{

m_hRecv =

CreateThread(NULL,0,TcpRecvProc,(LPVOID)recvPar,0,NULL);

}else

{

m_hRecv =

CreateThread(NULL,0,UdpRecvProc,(LPVOID)recvPar,0,NULL);

}

return TRUE;

}

BOOL TSocket::Stop()

{

//Kill线程???

if (m_hRecv!=NULL)

{

TerminateThread(m_hRecv,0);

//关闭socket

closesocket(m_socket);

}

m_bIsRun = FALSE;

return TRUE;

}

DWORD TSocket::TcpSend()

{

if (m_ulRemoteIP==0)

return -1;

SOCKET SocketSend;

SocketSend=CreateSocket(TRUE);

if (SocketSend==INVALID_SOCKET)

{

return -1;

}

SOCKADDR_IN SocketSendIn;

SocketSendIn.sin_family = AF_INET;

SocketSendIn.sin_addr.S_un.S_addr = htonl(m_ulRemoteIP);

SocketSendIn.sin_port = htons(m_usRemotePort);

char szBuf[50];

//先建立连接

int nRet =

connect(SocketSend,(SOCKADDR*)&SocketSendIn,sizeof(SOCKADDR));

if (nRet==SOCKET_ERROR)

{

return -1;

}

nRet = recv(SocketSend,szBuf,sizeof(szBuf),0);

if (nRet==0)//超时

{

return -2;

}

//开始发送数据

send(SocketSend,m_strData.GetBuffer(0),m_strData.GetLength(),0);

closesocket(SocketSend);

return 0;

}

DWORD TSocket::UdpSend()

{

if (m_ulRemoteIP==0)

return -1;

SOCKET SocketSend;

SocketSend=CreateSocket(FALSE);

if (SocketSend==INVALID_SOCKET)

{

return -1;

}

SOCKADDR_IN SocketSendIn;

SocketSendIn.sin_family = AF_INET;

SocketSendIn.sin_addr.S_un.S_addr = htonl(m_ulRemoteIP);

SocketSendIn.sin_port = htons(m_usRemotePort);

int nSenlen=m_strData.GetLength()+1;

sendto(SocketSend,m_strData,nSenlen,0,(SOCKADDR

*)&SocketSendIn,sizeof(SOCKADDR));

closesocket(SocketSend);

return 0;

}

DWORD TSocket::SendData( CString strSend )

{

//保存数据

m_strData = strSend;

if (m_bMode)

{

CreateThread(NULL,0,TcpSendProc,(LPVOID)this,0,NULL);

}else

{

CreateThread(NULL,0,UdpSendProc,(LPVOID)this,0,NULL);

}

return 0;

}

SOCKET TSocket::GetSocket()

{

return m_socket;

}

DWORD WINAPI TSocket::TcpSendProc( LPVOID lpParameter )

{

TSocket* pThis = (TSocket*)lpParameter;

return pThis->TcpSend();

}

DWORD WINAPI TSocket::UdpSendProc( LPVOID lpParameter )

{

TSocket* pThis = (TSocket*)lpParameter;

return pThis->UdpSend();

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值