Files
2022-10-26 12:25:11 +08:00

94 lines
2.6 KiB
C++

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include "CSockLi.h"
#pragma comment(lib, "ws2_32.lib")
CSockLi::CSockLi()
{
WSADATA wsaData;
WSAStartup(0x0202, &wsaData);
m_hSocket = INVALID_SOCKET;
}
CSockLi::~CSockLi()
{
Close();
}
BOOL CSockLi::Create(UINT nSocketPort, int nSockType, LPCTSTR lpszSocketAddress)
{
m_hSocket = socket(AF_INET, nSockType, 0);//创建套接字
if (m_hSocket == INVALID_SOCKET)
return false;
//设置IP地址和端口
sockaddr_in sa = {AF_INET};
sa.sin_port = htons(nSocketPort);
if (lpszSocketAddress)
sa.sin_addr.s_addr = inet_addr(lpszSocketAddress);
//绑定套接字和IP地址端口
return !bind(m_hSocket, (sockaddr*)&sa, sizeof(sa));
}
int CSockLi::SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCSTR lpszHostAddress,
int nFlags)
{
sockaddr_in to = {AF_INET};
to.sin_port = htons(nHostPort);
to.sin_addr.s_addr = inet_addr(lpszHostAddress);
return sendto(m_hSocket, (LPCSTR)lpBuf, nBufLen, nFlags, (sockaddr*)&to, sizeof(to));
}
int CSockLi::ReceiveFrom(void* lpBuf, int nBufLen, char* rSocketAddress, UINT& rSocketPort, int nFlags)
{
sockaddr_in from = {AF_INET};
int lenFrom=sizeof(from);
int n = recvfrom(m_hSocket, (LPSTR)lpBuf, nBufLen, nFlags, (sockaddr*)&from, &lenFrom);
strcpy(rSocketAddress, inet_ntoa(from.sin_addr));
rSocketPort = htons(from.sin_port);
return n;
}
BOOL CSockLi::GetPeerName(char* rSocketAddress, UINT& rSocketPort)
{
sockaddr_in name = { AF_INET };
int lenname = sizeof(name);
if (getpeername(m_hSocket, (sockaddr*)&name, &lenname) < 0)
return false;
strcpy(rSocketAddress, inet_ntoa(name.sin_addr));
rSocketPort = htons(name.sin_port);
return true;
}
BOOL CSockLi::GetSockName(char* rSocketAddress, UINT& rSocketPort)
{
sockaddr_in name = { AF_INET };
int lenname = sizeof(name);
if (getsockname(m_hSocket, (sockaddr*)&name, &lenname) < 0)
return false;
strcpy(rSocketAddress, inet_ntoa(name.sin_addr));
rSocketPort = htons(name.sin_port);
return true;
}
BOOL CSockLi::Accept(CSockLi& rConnectedSock, LPSTR szIp, UINT *nPort)
{
sockaddr_in sa = {AF_INET};
int nLen = sizeof(sa);
rConnectedSock.m_hSocket = accept(this->m_hSocket, (sockaddr*)&sa, &nLen);
if (rConnectedSock.m_hSocket == INVALID_SOCKET)
return false;
if(szIp)
strcpy(szIp, inet_ntoa(sa.sin_addr));
if(nPort)
*nPort = htons(sa.sin_port);
return true;
}
BOOL CSockLi::Connection(LPCSTR lpszHostAddress, UINT nPort)
{
sockaddr_in sa = { AF_INET };
sa.sin_port = htons(nPort);
sa.sin_addr.s_addr = inet_addr(lpszHostAddress);
return !connect(m_hSocket, (sockaddr*)&sa, sizeof(sa));
}