94 lines
2.6 KiB
C++
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));
|
|
} |