Socket.h
#ifndef _CSOKET_H_
#define _CSOKET_H_
#include <winsock2.h>
#include <windows.h>
class CSoCket
{
protected:
SOCKET m_hSocket;
public:
CSoCket();
virtual ~CSoCket();
BOOL Listen(int n = 5);
BOOL Accept(CSoCket& rConnectedSocket,LPSTR szIP = NULL,UINT* nPort = NULL);
BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort);
int Send(const void* lpBuf, int nBufLen, int nFlags = 0);//发送数据
BOOL GetPeerName(char* rSocketAddress, UINT& rSocketPort);//得到名字PEER版本
BOOL GetSockName(char* rSocketAddress, UINT& rSocketPort);//得到名字SOCK版本
BOOL Create(UINT nSocketPort = 0,int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL);//创建
int SendTo(const void* lpBuf,int nBuflen,UINT nHostPort,LPCTSTR lpszHostAddress = (LPCTSTR)0,int nFlags = 0);//发送给指定目标
int ReceiveFrom(void* lpBuf, int nBufLen, char* rSocketAddress, UINT& rSocketPort,int nFlags = 0);//接收,阻塞模式
int Receive(void* lpBug, int nBufLen, int nFlags = 0);
void Close();
};
#endif // !
Socket.cpp
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "Socket.h"
#pragma comment(lib,"ws2_32.lib")
CSoCket::CSoCket()
{
WSAData wd;
WSAStartup(0x0202,&wd);
m_hSocket = INVALID_SOCKET;
}
CSoCket::~CSoCket()
{
Close();
}
BOOL CSoCket::Listen(int n)
{
return !listen(m_hSocket,n);
}
BOOL CSoCket::Accept(CSoCket & rConnectedSocket, LPSTR szIP, UINT * nPort)
{
sockaddr_in sa = {AF_INET};
int nLen = sizeof(sa);
rConnectedSocket.m_hSocket = accept(m_hSocket,(sockaddr*)&sa,&nLen);
if (INVALID_SOCKET == rConnectedSocket.m_hSocket)
return FALSE;
if (szIP)
strcpy(szIP,inet_ntoa(sa.sin_addr));
if (nPort)
*nPort = htons(sa.sin_port);
return TRUE;
}
BOOL CSoCket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
{
sockaddr_in sa = {AF_INET,htons(nHostPort)};
sa.sin_addr.S_un.S_addr = inet_addr(lpszHostAddress);//地址
return !connect(m_hSocket, (sockaddr*)&sa, sizeof(sa));
}
int CSoCket::Send(const void * lpBuf, int nBufLen, int nFlags)
{
return send(m_hSocket,(LPTSTR)lpBuf,nBufLen,nFlags);
}
BOOL CSoCket::GetPeerName(char * rSocketAddress, UINT & rSocketPort)
{
sockaddr_in name = { AF_INET };
int nLen = sizeof(name);
if (getpeername(m_hSocket, (sockaddr*)&name, &nLen) < 0)
return FALSE;
rSocketPort = htons(name.sin_port);
strcpy(rSocketAddress, inet_ntoa(name.sin_addr));
return TRUE;
}
BOOL CSoCket::GetSockName(char * rSocketAddress, UINT & rSocketPort)
{
sockaddr_in name = {AF_INET};
int nLen = sizeof(name);
if (getsockname(m_hSocket, (sockaddr*)&name, &nLen) < 0)
return FALSE;
rSocketPort = htons(name.sin_port);
strcpy(rSocketAddress, inet_ntoa(name.sin_addr));
return TRUE;
}
BOOL CSoCket::Create(UINT nSocketPort, int nSocketType, LPCTSTR lpszSocketAddress)
{
m_hSocket = socket(AF_INET, nSocketType, 0);
if (m_hSocket == INVALID_SOCKET)
return FALSE;
sockaddr_in sa =
{
AF_INET,
htons(nSocketPort)
};
if (lpszSocketAddress)
sa.sin_addr.s_addr = inet_addr(lpszSocketAddress);
return !bind(m_hSocket, (sockaddr*)&sa, sizeof(sa));;
}
int CSoCket::SendTo(const void * lpBuf, int nBuflen, UINT nHostPort, LPCTSTR lpszHostAddress, int nFlags)
{
sockaddr_in sa = { AF_INET,htons(nHostPort) };
if (lpszHostAddress)
sa.sin_addr.s_addr = inet_addr(lpszHostAddress);
BOOL b = sendto(m_hSocket,(char*)lpBuf,nBuflen,0,(sockaddr*)&sa,sizeof(sa));
return 0;
}
int CSoCket::ReceiveFrom(void* lpBuf, int nBufLen, char* rSocketAddress, UINT& rSocketPort, int nFlags)
{
sockaddr_in sa = { AF_INET };
int nlen = sizeof(sa);
int nRet = recvfrom(m_hSocket, (char*)lpBuf, nBufLen,0, (sockaddr*)&sa, &nlen);
if (nRet > 0)
{
rSocketPort = htons(sa.sin_port);
strcpy(rSocketAddress,inet_ntoa(sa.sin_addr));
}
return nRet;
}
int CSoCket::Receive(void * lpBug, int nBufLen, int nFlags)
{
return recv(m_hSocket,(LPTSTR)lpBug,nBufLen,nFlags);
}
void CSoCket::Close()
{
closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
}
使用方法
if (!m_Sock.Create(PORT))
{
std::cout << "创建失败" << std::endl;
return;
}
m_Sock.Listen();
char sIP[20] = {};
UINT nPort;
while (m_Sock.Accept(*sockea, sIP, &nPort))
{
//这里就可以干活了发送和接收
}